Web2py数据库抽象层 Web2py视图 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' 分别代表 true 和 False 。 MySQL的 MySQL不支持ALTER TABLE功能。因此,数据库的迁移涉及多个提交。在定义数据库时,可以通过设置参数 fake_migrate = True 来避免这种情况,该数据库将保留所有元数据。 神谕 Oracle不支持记录分页功能。它也缺乏对关键字OFFSET或限制的支持。为此,web2py借助复杂的三向DAL嵌套选择实现分页。如果使用Oracle数据库,则DAL需要自行处理分页。 Web2py视图 Web2py表单和验证器