Web2py数据库抽象层


数据库抽象层(DAL) 被认为是web2py中的主要力量。DAL将简单的应用程序编程接口(API)暴露给底层的SQL语法。

在本章中,我们将了解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'))

上述方法也用于Table构造函数之间。表构造函数的语法是相同的。第一个参数是表名,后跟一个 字段 列表。字段构造函数接受以下参数 -

Sr.No 参数和用法
1 字段名称
表中字段的名称。
2 字段类型
接受具有任何数据类型的值,例如字符串(默认值),文本,布尔值,整数等等。
3 Length
定义最大长度。
4 default = None
这是插入新记录时的默认值。
5 update = None
这与默认值相同,但该值仅在更新时使用,而不是在插入时使用。
6 Notnull
这指定字段值是否可以为NULL。
7 readable = True
这指定该字段是否可以在表单中阅读。
8 writable = True
这指定该字段是否可以在表单中写入。
9 label = "Field Name"
这是表单中用于此字段的标签。

define_table 方法也有三个命名参数-

句法

dbpy.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,如下所示 -

_

它有助于获取给定表的插入语句。例如,

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

它将检索名为“person”的表的insert语句。

SQL语句输出 -

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

_计数

它有助于获取SQL语句,从而提供记录数。例如,考虑一个名为'person'的表,我们需要找到名字为'ABC'的人数。

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

SQL语句输出 -

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

_选择

它有助于获取选择的SQL语句。例如,考虑一个名为'person'的表,我们需要找到名字为'ABC'的人员列表。

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

SQL语句输出 -

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

_删除

它有助于获取 删除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的知识范围内保留更改或删除等任何更改。

SQLite不支持布尔类型。为此,web2py内部将布尔值映射为1个字符的字符串,'T'和'F' 分别代表 trueFalse

MySQL的

MySQL不支持ALTER TABLE功能。因此,数据库的迁移涉及多个提交。在定义数据库时,可以通过设置参数 fake_migrate = True 来避免这种情况,该数据库将保留所有元数据。

神谕

Oracle不支持记录分页功能。它也缺乏对关键字OFFSET或限制的支持。为此,web2py借助复杂的三向DAL嵌套选择实现分页。如果使用Oracle数据库,则DAL需要自行处理分页。