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