Web2py 数据库抽象层
数据库抽象层 (DAL) 被认为是web2py的主要优势。DAL向底层SQL语法提供了一个简单的应用程序编程接口(API)。
在本章中,我们将了解DAL的一些复杂应用,比如高效地构建按标签搜索的查询和构建一个层次化分类树。
DAL的一些重要特点包括:
- web2py包括一个数据库抽象层(DAL),它将Python对象映射为数据库对象。数据库对象可以是查询、表和记录。
-
DAL在实时中使用指定数据库后端的方言动态生成SQL,因此开发人员不必编写完整的SQL查询语句。
-
使用DAL的主要优势是应用程序在不同类型的数据库中可移植。
开始使用DAL
在web2py中,大多数应用程序都需要与数据库建立连接。因此,设计应用程序时,建立数据库模型是第一步。
假设我们创建了一个名为 “helloWorld” 的应用程序。数据库实现在应用程序的“Models”下。该应用程序的所有模型都包含在名为 models/db_custom.py 的文件中。
实现DAL的以下步骤如下:
步骤1 – DAL构造函数
建立数据库连接。可以使用DAL对象(也称为DAL构造函数)来创建连接。
db = DAL ('sqlite://storage.sqlite')
DAL的显著特点是它允许与相同数据库或不同数据库建立多个连接,甚至与不同类型的数据库建立连接。观察到该行已经存在于文件 models/db.py 中。因此,除非您删除它或需要连接到不同的数据库,否则您可能不需要它。默认情况下,web2py连接到存储在文件 storage.sqlite 中的SQLite数据库。
此文件位于应用程序的数据库文件夹中。如果文件不存在,则在首次执行应用程序时,web2py会自动创建该文件。
SQLite速度快,并且将所有数据存储在一个单独的文件中。这意味着您的数据可以轻松地从一个应用程序转移到另一个应用程序。实际上,SQLite数据库与应用程序一起由web2py打包。它提供完整的SQL支持,包括翻译、连接和聚合功能。
SQLite有两个缺点:
- 其一是它不强制执行列类型,并且除了添加和删除列之外,没有ALTER TABLE操作。
-
另一个缺点是任何需要写访问权限的事务都会锁定整个数据库。
步骤2-表构造器
一旦建立与数据库的连接,我们可以使用 define_table 方法来定义新的数据表。
例如:
db.define_table('invoice',Field('name'))
以上方法也在Table构造函数中使用。表构造函数的语法相同。第一个参数是表名,后面跟着一个列表,其中包含 字段 。字段构造函数采用以下参数−
Sr.No | 参数和用法 |
---|---|
1 | 字段名称 表中字段的名称。 |
2 | 字段类型 可以取字符串(默认)、文本、布尔、整数等任何数据类型的值。 |
3 | 长度 定义最大长度。 |
4 | 默认 = None 插入新记录时的默认值。 |
5 | 更新 = None 这与默认值相同,但该值仅在更新时使用,而不在插入时使用。 |
6 | 不为空 指定字段值是否可以为空。 |
7 | 可读 = True 指定字段在表单中是否可读。 |
8 | 可写 = True 指定字段在表单中是否可写。 |
9 | 标签 = “字段名称” 这是在表单中为该字段使用的标签。 |
定义表 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’ - 这是一个格式字符串,决定给定表中记录的表示方式。
生成原始SQL
使用DAL,我们可以建立与数据库的连接,并使用表构造器和字段构造器创建新表及其字段。
有时需要生成符合所需输出的SQL语句。web2py包括各种函数,用于生成原始SQL,如下所示:
_insert
它可以帮助获取给定表的插入语句。例如:
print db.person._insert(name ='ABC')
它将检索名为“person”的表的插入语句。 SQL语句输出 –
INSERT INTO person(name) VALUES ('ABC');
_count
它用于获取SQL语句,该语句返回记录数量。例如,假设有一个名为“person”的表,我们需要找到名为“ABC”的人的数量。
print db(db.person.name ==' ABC ')._count()
SQL语句的输出:
SELECT count(*) FROM person WHERE person.name = ' ABC ';
_select
它用于获取select SQL语句。例如,考虑一个名为’person’的表,我们需要找出姓名为’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的问题(注意事项)
SQLite
SQLite不支持删除或修改列。从表中删除一个字段会使其保留在数据库中,因此web2py将不会意识到任何更改。
在这种情况下,需要设置 fake_migrate = True ,这将重新定义元数据,以便web2py了解任何alter或delete的更改。
SQLite不支持布尔类型。因此,web2py将布尔值内部映射为一个字符字符串,’T’表示 true ,’F’表示 False 。
MySQL
MySQL不支持ALTER TABLE功能。因此,数据库迁移涉及多个提交。可以通过在定义数据库时设置参数 fake_migrate=True 来避免这种情况,这将保留所有元数据。
Oracle
Oracle不支持记录的分页功能。它也不支持关键字OFFSET或limit。因此,web2py通过使用复杂的三重嵌套的DAL查询来实现分页。如果使用了Oracle数据库,DAL需要自己处理分页。