Web2py - 数据抽象层

  • 简述

    数据库抽象层 (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'))
    
    上面的方法也用在Table构造器当中。表构造函数的语法是相同的。第一个参数是表名,后面是Field(s)列表。字段构造函数采用以下参数 -
    序号 参数和用法
    1
    字段名称
    表中字段的名称。
    2
    字段类型
    接受具有任何数据类型的值,例如字符串(默认)、文本、布尔值、整数等。
    3
    长度
    定义最大长度。
    4
    default = None
    这是插入新记录时的默认值。
    5
    update = None
    这与默认值相同,但该值仅用于更新,而不用于插入。
    6
    非空
    这指定字段值是否可以为 NULL。
    7
    可读=True
    这指定该字段在表单中是否可读。
    8
    可写=True
    这指定该字段在表单中是否可写。
    9
    label = "字段名"
    这是用于表单中此字段的标签。
    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

    它有助于获取选择的 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 的知识范围内。
    SQLite 不支持布尔类型。为此,web2py 在内部将布尔值映射为 1 个字符串,'T' 和 'F' 分别代表trueFalse

    MySQL

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

    Oracle

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