数据库抽象层(DAL)被认为是web2py中的主要力量。DAL向基础SQL语法公开了一个简单的应用程序编程接口(API)。
在本章中,我们将了解DAL的非平凡应用程序,例如构建查询以按标签高效搜索以及构建分层类别树。
DAL的一些重要功能:
- web2py包括数据库抽象层(DAL),这是一个将Python对象映射到数据库对象的API。数据库对象可以是查询,表和记录。
- 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连接到存储在文件storage.sqlite中的SQLite数据库。
该文件位于应用程序的数据库文件夹中。如果文件不存在,则由web2py在首次执行应用程序时创建。
SQLite速度很快,并将所有数据存储在一个文件中。这意味着您的数据可以轻松地从一个应用程序传输到另一个应用程序。实际上,SQLite数据库是由web2py与应用程序打包在一起的。它提供了完整的SQL支持,包括翻译,联接和聚合。
SQLite有两个缺点。
- 一种是它不强制执行列类型,除了添加和删除列外,没有ALTER TABLE。
- 另一个缺点是,整个数据库被任何需要写访问权的事务锁定。
第2步-表构造器
建立与数据库的连接后,我们可以使用define_table方法定义新表。
例如:
db.define_table('invoice',Field('name'))
表构造器中也使用了上述方法。表构造函数的语法是相同的。第一个参数是表名,其后是Field(s)的列表。字段构造函数采用以下参数:
序号 | 参数与用法 |
---|---|
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')
- migration = True-如果web2py不存在该表,它将指示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
它有助于获取选择的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问题(Gotchas)
SQLite
SQLite缺少删除或更改列的支持。从表中删除字段会使该字段在数据库中保持活动状态,因此web2py将不知道所做的任何更改。
在这种情况下,必须设置fake_migrate = True,这将有助于重新定义元数据,以便任何更改(例如alter或delete)都将在web2py的知识范围内得以保留。
SQLite不支持布尔类型。为此,web2py在内部将布尔值映射到1个字符串,其中“ T”和“ F”分别表示true和False。
MySQL
MySQL不支持ALTER TABLE功能。因此,数据库的迁移涉及多个提交。可以通过在定义数据库时设置参数fake_migrate = True来避免这种情况,该数据库将保留所有元数据。
Oracle
Oracle不支持记录分页功能。它还缺乏对关键字OFFSET或limit的支持。为此,web2py借助DAL的复杂三路嵌套选择来实现分页。如果已使用Oracle数据库,则DAL需要自己处理分页。
作者:terry,如若转载,请注明出处:https://www.web176.com/web2py/878.html