📜  Web2py-数据库抽象层

📅  最后修改于: 2020-10-17 05:19:06             🧑  作者: Mango


数据库抽象层(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速度很快,并将所有数据存储在一个文件中。这意味着您的数据可以轻松地从一个应用程序传输到另一个应用程序。实际上,web2py将SQLite数据库与应用程序打包在一起。它提供了完整的SQL支持,包括翻译,联接和聚合。

SQLite有两个缺点。

  • 一种是它不强制执行列类型,除了添加和删除列外,没有ALTER TABLE。

  • 另一个缺点是,整个数据库被任何需要写访问权的事务锁定。

第2步-表构造器

建立与数据库的连接后,我们可以使用define_table方法定义新表。

例如-

db.define_table('invoice',Field('name'))

表构造器中也使用了上述方法。表构造函数的语法是相同的。第一个参数是表名,其后是Field(s)的列表。字段构造函数采用以下参数-

Sr.No Arguments & Usage
1

The field name

Name of the field in table.

2

The field type

takes values having any of the datatypes such as string (default), text, boolean, integer and so on.

3

Length

Defines the maximum length.

4

default = None

This is the default value when a new record is inserted.

5

update = None

This works the same as default, but the value is used only on update, not on insert.

6

Notnull

This specifies whether the field value can be NULL or not.

7

readable = True

This specifies whether the field is readable in forms or not.

8

writable = True

This specifies whether the field is writable in forms or not.

9

label = “Field Name”

This is the label to be used for this field in forms.

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

_插入

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

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

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

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

_更新

它有助于获取更新的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”分别代表真假

的MySQL

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

甲骨文

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