Web2py - ฐานข้อมูล Abstraction Layer

Database Abstraction Layer (DAL)ถือเป็นจุดแข็งที่สำคัญของ web2py DAL แสดงส่วนต่อประสานการเขียนโปรแกรมประยุกต์ (API) อย่างง่ายให้กับไวยากรณ์ SQL ที่เป็นพื้นฐาน

ในบทนี้เราจะทำความรู้จักกับแอปพลิเคชันที่ไม่สำคัญของ DAL เช่นการสร้างคิวรีเพื่อค้นหาด้วยแท็กอย่างมีประสิทธิภาพและการสร้างแผนผังหมวดหมู่ตามลำดับชั้น

คุณสมบัติที่สำคัญบางประการของ DAL ได้แก่ -

  • web2py มี Database Abstraction Layer (DAL) ซึ่งเป็น API ที่แมปวัตถุ Python เข้ากับวัตถุฐานข้อมูล วัตถุฐานข้อมูลสามารถแบบสอบถามตารางและระเบียน

  • DAL สร้าง SQL แบบไดนามิกแบบเรียลไทม์โดยใช้ภาษาถิ่นที่ระบุสำหรับแบ็คเอนด์ของฐานข้อมูลดังนั้นจึงไม่จำเป็นสำหรับนักพัฒนาในการเขียนแบบสอบถาม SQL ที่สมบูรณ์

  • ข้อได้เปรียบที่สำคัญของการใช้ DAL คือแอปพลิเคชันจะสามารถพกพาได้กับฐานข้อมูลประเภทต่างๆ

เริ่มต้นใช้งาน DAL

แอปพลิเคชันส่วนใหญ่ใน web2py ต้องการการเชื่อมต่อฐานข้อมูล ดังนั้นการสร้างแบบจำลองฐานข้อมูลจึงเป็นขั้นตอนแรกในการออกแบบแอปพลิเคชัน

พิจารณาแอปพลิเคชันที่สร้างขึ้นใหม่ชื่อ “helloWorld”. ฐานข้อมูลถูกนำไปใช้ภายใต้โมเดลของแอปพลิเคชัน ทุกรุ่นสำหรับแอปพลิเคชันที่เกี่ยวข้องประกอบด้วยไฟล์ชื่อ -models/db_custom.py.

ขั้นตอนต่อไปนี้ใช้สำหรับการนำ DAL ไปใช้ -

ขั้นตอนที่ 1 - ตัวสร้าง DAL

สร้างการเชื่อมต่อฐานข้อมูล สิ่งนี้ถูกสร้างขึ้นโดยใช้วัตถุ DAL ซึ่งเรียกอีกอย่างว่าตัวสร้าง DAL

db = DAL ('sqlite://storage.sqlite')

คุณสมบัติเด่นของ DAL คือช่วยให้สามารถเชื่อมต่อกับฐานข้อมูลเดียวกันหรือหลายฐานข้อมูลได้แม้จะมีฐานข้อมูลประเภทต่างๆ เป็นที่สังเกตว่ามีบรรทัดนี้อยู่ในไฟล์แล้วmodels/db.py. ดังนั้นคุณอาจไม่จำเป็นต้องใช้เว้นแต่คุณจะลบออกหรือจำเป็นต้องเชื่อมต่อกับฐานข้อมูลอื่น โดยค่าเริ่มต้น web2py จะเชื่อมต่อกับฐานข้อมูล SQLite ที่เก็บไว้ในไฟล์storage.sqlite.

ไฟล์นี้อยู่ในโฟลเดอร์ฐานข้อมูลของแอปพลิเคชัน หากไม่มีไฟล์จะถูกสร้างขึ้นโดย web2py เมื่อแอปพลิเคชันถูกเรียกใช้ครั้งแรก

SQLite นั้นรวดเร็วและเก็บข้อมูลทั้งหมดไว้ในไฟล์เดียว ซึ่งหมายความว่าข้อมูลของคุณสามารถถ่ายโอนจากแอปพลิเคชันหนึ่งไปยังอีกแอปพลิเคชันหนึ่งได้อย่างง่ายดาย ในความเป็นจริงฐานข้อมูล SQLite ได้รับการบรรจุโดย web2py ร่วมกับแอปพลิเคชัน ให้การสนับสนุน SQL เต็มรูปแบบรวมถึงการแปลการรวมและการรวม

มีข้อเสียสองประการของ SQLite

  • ประการหนึ่งคือไม่บังคับใช้ประเภทคอลัมน์และไม่มี ALTER TABLE ยกเว้นการเพิ่มและวางคอลัมน์

  • ข้อเสียอื่น ๆ คือฐานข้อมูลทั้งหมดถูกล็อกโดยธุรกรรมใด ๆ ที่ต้องมีการเข้าถึงการเขียน

ขั้นตอนที่ 2 - ตัวสร้างตาราง

เมื่อสร้างการเชื่อมต่อกับฐานข้อมูลแล้วเราสามารถใช้ไฟล์ define_table วิธีการกำหนดตารางใหม่

ตัวอย่างเช่น -

db.define_table('invoice',Field('name'))

วิธีการข้างต้นยังใช้ระหว่างตัวสร้างตาราง ไวยากรณ์สำหรับตัวสร้างตารางจะเหมือนกัน อาร์กิวเมนต์แรกคือชื่อตารางและตามด้วยรายการField(s). ตัวสร้างฟิลด์รับอาร์กิวเมนต์ต่อไปนี้ -

ซีเนียร์ No อาร์กิวเมนต์และการใช้งาน
1

The field name

ชื่อของเขตข้อมูลในตาราง

2

The field type

รับค่าที่มีประเภทข้อมูลเช่นสตริง (ค่าเริ่มต้น) ข้อความบูลีนจำนวนเต็มและอื่น ๆ

3

Length

กำหนดความยาวสูงสุด

4

default = None

นี่คือค่าเริ่มต้นเมื่อมีการแทรกระเบียนใหม่

5

update = None

วิธีนี้ใช้งานได้เหมือนกับค่าเริ่มต้น แต่จะใช้ค่านี้ในการอัปเดตเท่านั้นไม่ใช่ในการแทรก

6

Notnull

สิ่งนี้ระบุว่าค่าฟิลด์สามารถเป็น NULL หรือไม่

7

readable = True

สิ่งนี้ระบุว่าฟิลด์สามารถอ่านได้ในแบบฟอร์มหรือไม่

8

writable = True

สิ่งนี้ระบุว่าฟิลด์สามารถเขียนได้ในรูปแบบหรือไม่

9

label = "Field Name"

นี่คือป้ายกำกับที่จะใช้สำหรับฟิลด์นี้ในแบบฟอร์ม

define_table วิธีการยังใช้อาร์กิวเมนต์ที่มีชื่อสามตัว -

ไวยากรณ์

db.define_table('....',migrate=True, fake_migrate=False, format = '%(id)s')
  • migrate = True - สิ่งนี้สั่งให้ web2py สร้างตารางหากไม่มีอยู่หรือแก้ไขหากไม่ตรงกับข้อกำหนดของโมเดล

  • fake_migrate = False - หากโมเดลตรงกับเนื้อหาตารางฐานข้อมูลให้ตั้งค่า fake_migrate = True ซึ่งช่วยให้ web2py สร้างข้อมูลขึ้นมาใหม่

  • format = '%(id)s' - นี่คือสตริงรูปแบบที่กำหนดว่าควรจะแสดงระเบียนบนตารางที่กำหนดอย่างไร

การสร้าง Raw SQL

ด้วยการใช้ DAL เราสามารถสร้างการเชื่อมต่อกับฐานข้อมูลและสร้างตารางและฟิลด์ใหม่โดยใช้ตัวสร้างตารางและตัวสร้างฟิลด์

บางครั้งจำเป็นต้องสร้างคำสั่ง SQL เพื่อให้สอดคล้องกับผลลัพธ์ที่จำเป็น web2py มีฟังก์ชันต่าง ๆ ซึ่งช่วยในการสร้าง SQL ดิบซึ่งมีดังต่อไปนี้ -

_แทรก

ช่วยในการดึงคำสั่งแทรกสำหรับตารางที่กำหนด ตัวอย่างเช่น,

print db.person._insert(name ='ABC')

มันจะดึงคำสั่งแทรกสำหรับตารางชื่อ "บุคคล"

เอาต์พุตคำสั่ง SQL -

INSERT INTO person(name) VALUES ('ABC');

_นับ

ช่วยในการดึงคำสั่ง SQL ซึ่งให้จำนวนระเบียน ตัวอย่างเช่นพิจารณาตารางชื่อ 'บุคคล' และเราต้องหาจำนวนบุคคลที่มีชื่อ 'ABC'

print db(db.person.name ==' ABC ')._count()

เอาต์พุตคำสั่ง SQL -

SELECT count(*) FROM person WHERE person.name = ' ABC ';

_เลือก

ช่วยในการดึงคำสั่ง SQL ที่เลือก ตัวอย่างเช่นพิจารณาตารางชื่อ 'บุคคล' และเราต้องหารายชื่อบุคคลที่มีชื่อ 'ABC'

print db(db.person.name == ' ABC ')._select()

เอาต์พุตคำสั่ง SQL -

SELECT person.name FROM person WHERE person.name = ' ABC ';

_ลบ

ช่วยในการดึงไฟล์ delete SQLงบ ตัวอย่างเช่นพิจารณาตารางที่ชื่อ 'person' และเราจำเป็นต้องลบข้อความที่มีชื่อ 'ABC'

print db(db.person.name == ' ABC ')._delete()

เอาต์พุตคำสั่ง SQL -

DELETE FROM person WHERE person.name = ' ABC ';4

_update

ช่วยในการดึงข้อมูลคำสั่ง SQL ที่อัปเดต ตัวอย่างเช่นพิจารณาตารางที่ชื่อ 'person' และเราจำเป็นต้องอัปเดตชื่อคอลัมน์ด้วยค่าอื่น ๆ

print db(db.person.name == ' ABC ')._update()

เอาต์พุตคำสั่ง SQL -

UPDATE person SET WHERE person.name = ’Alex’;

ปัญหาเกี่ยวกับ DAL (Gotchas)

SQLite

SQLite ขาดการสนับสนุนในการวางหรือแก้ไขคอลัมน์ การลบเขตข้อมูลออกจากตารางจะช่วยให้สามารถใช้งานได้ในฐานข้อมูลเนื่องจาก web2py จะไม่ทราบถึงการเปลี่ยนแปลงใด ๆ ที่เกิดขึ้น

ในกรณีนี้จำเป็นต้องตั้งค่าไฟล์ fake_migrate = True ซึ่งจะช่วยในการกำหนดข้อมูลเมตาใหม่เพื่อให้การเปลี่ยนแปลงใด ๆ เช่นแก้ไขหรือลบจะถูกเก็บไว้ภายใต้ความรู้ของ web2py

SQLite ไม่รองรับประเภทบูลีน สำหรับสิ่งนี้ web2py จะแมป Booleans เป็นสตริงอักขระ 1 ตัวภายในโดยมี 'T' และ 'F' แทนtrue และ False ตามลำดับ

MySQL

MySQL ไม่รองรับคุณสมบัติ ALTER TABLE ดังนั้นการย้ายฐานข้อมูลจึงเกี่ยวข้องกับการกระทำหลายอย่าง สถานการณ์นี้สามารถหลีกเลี่ยงได้โดยการตั้งค่าพารามิเตอร์fake_migrate = True ในขณะที่กำหนดฐานข้อมูลซึ่งจะยังคงมีข้อมูลเมตาทั้งหมดอยู่

Oracle

Oracle ไม่สนับสนุนคุณลักษณะของการแบ่งหน้าของระเบียน นอกจากนี้ยังขาดการสนับสนุนสำหรับคำหลัก OFFSET หรือขีด จำกัด ด้วยเหตุนี้ web2py จึงมีการแบ่งหน้าด้วยความช่วยเหลือของ DAL แบบซ้อนสามทางที่ซับซ้อน DAL จำเป็นต้องจัดการการแบ่งหน้าด้วยตนเองหากมีการใช้ฐานข้อมูล Oracle