ZetCode

pyDAL

最后修改于 2024 年 1 月 29 日

pyDAL 教程展示了如何使用 pyDAL 数据库抽象层在 Python 中进行数据库编程。 我们在代码示例中使用 SQLite。

pyDAL

pyDAL 是一个纯 Python 数据库抽象层。 pyDAL 模块动态地为数据库后端生成指定方言的 SQL。 生成的代码将在不同类型的数据库之间具有可移植性。

pyDAL 安装

$ sudo pip3 install pyDAL

我们使用 pip3 工具来安装 pyDAL。

pyDAL 创建数据库表

在下面的示例中,我们创建一个数据库表。

create_table.py
#!/usr/bin/python

from pydal import DAL, Field

db = DAL('sqlite://test.db', folder='dbs')

try:
    db.define_table('cars', Field('name'), Field('price', type='integer'))
    db.cars.insert(name='Audi', price=52642)
    db.cars.insert(name='Skoda', price=9000)
    db.cars.insert(name='Volvo', price=29000)
    db.cars.insert(name='Bentley', price=350000)
    db.cars.insert(name='Citroen', price=21000)
    db.cars.insert(name='Hummer', price=41400)
    db.cars.insert(name='Volkswagen', price=21600)

finally:

    if db:
        db.close()

该示例创建一个包含七行的 cars 表。

db = DAL('sqlite://test.db', folder='dbs')

DAL 表示数据库连接。 它将数据库连接字符串作为第一个参数。 我们连接到 SQLite 数据库。

db.define_table('cars', Field('name'), Field('price', type='integer'))

数据库表使用 define_table 定义。 如果它不存在,则会创建它。 它有两个字段:name 和 price。 会自动生成一个 id 字段。

db.cars.insert(name='Audi', price=52642)

我们使用 insert 将新行插入到表中。 该方法在 db 连接的 cars 表上调用。

$ ls dbs
c95cf9bab36fcb04c2424cdf9be0f6e3_cars.table  sql.log  test.db

除了 test.db 数据库,我们还有一个带有 .table 扩展名的迁移文件和一个日志文件。

pyDAL 删除表

数据库表使用 drop 删除。

drop_table.py
#!/usr/bin/python

from pydal import DAL, Field

try:

    db = DAL('sqlite://test.db', folder='dbs')
    cars = db.define_table('cars', Field('name'), Field('price', 'integer'))

    cars.drop()

finally:

    if db:
        db.close() 

在该示例中,我们使用 drop 方法删除 cars 表。

pyDAL 选择行

表行使用 select 选择。

select_all_rows.py
#!/usr/bin/python

from pydal import DAL, Field

try:

    db = DAL('sqlite://test.db', folder='dbs')
    db.define_table('cars', Field('name'), Field('price'))

    rows = db().select(db.cars.ALL)

    for row in rows:
        print("{} {} {}".format(row['id'], row['name'], row['price']))

finally:

    if db:
        db.close()      

在该示例中,我们检索 cars 表中的所有行。

rows = db().select(db.cars.ALL)

我们使用 select 方法获取所有行。 db.cars.ALL 指示选择表中的所有列。

for row in rows:
    print("{} {} {}".format(row['id'], row['name'], row['price']))

我们遍历每一行并打印其字段。

$ ./select_all_cars.py 
1 Audi 52642
2 Skoda 9000
3 Volvo 29000
4 Bentley 350000
5 Citroen 21000
6 Hummer 41400
7 Volkswagen 21600

pyDAL 排序

以下示例显示了如何使用 pyDAL 对数据进行排序。

order_by.py
#!/usr/bin/python

from pydal import DAL, Field

try:

    db = DAL('sqlite://test.db')
    db.define_table('cars', Field('name'), Field('price', 'integer'))

    rows = db(db.cars).select(orderby=db.cars.price)

    for row in rows:
        print("{} {} {}".format(row['id'], row['name'], row['price']))

    print("**************************************")        

    rows = db(db.cars).select(orderby=~db.cars.price)

    for row in rows:
        print("{} {} {}".format(row['id'], row['name'], row['price']))

finally:

    if db:
        db.close()         

该示例打印表中的所有行,并按价格升序和降序排列它们。

rows = db(db.cars).select(orderby=db.cars.price)

排序通过 select 方法的 orderby 参数完成。

rows = db(db.cars).select(orderby=~db.cars.price)

要按降序排序,我们使用波浪号字符。

$ ./order_by.py 
5 Citroen 21000
7 Volkswagen 21600
3 Volvo 29000
4 Bentley 350000
6 Hummer 41400
1 Audi 52642
2 Skoda 9000
**************************************
2 Skoda 9000
1 Audi 52642
6 Hummer 41400
4 Bentley 350000
3 Volvo 29000
7 Volkswagen 21600
5 Citroen 21000

pyDAL 限制数据输出

数据输出可以通过 select 方法的 limitby 参数来限制。

limit_by.py
#!/usr/bin/python

from pydal import DAL, Field

try:

    db = DAL('sqlite://test.db', folder='dbs')
    db.define_table('cars', Field('name'), Field('price', 'integer'))

    rows = db(db.cars).select(limitby=(2, 5))

    for row in rows:
        print("{} {} {}".format(row['id'], row['name'], row['price']))


finally:

    if db:
        db.close() 

在代码示例中,我们将输出限制为三行,偏移量为 2。

$ ./limit_by.py 
3 Volvo 29000
4 Bentley 350000
5 Citroen 21000

pyDAL 计数行

使用 count,我们可以获取表中的行数。

count_rows.py
#!/usr/bin/python

from pydal import DAL, Field

try:

    db = DAL('sqlite://test.db', folder='dbs')
    db.define_table('cars', Field('name'), Field('price', 'integer'))

    n = db(db.cars.id).count()

    print("There are {} rows in the table".format(n))

finally:

    if db:
        db.close()     

在该示例中,我们打印 cars 表中的行数。

$ ./count_rows.py 
There are 7 rows in the table

该表中有七行。

pyDAL JSON 输出

我们可以使用 as_json 以 JSON 格式获取数据。

json_output.py
#!/usr/bin/python

from pydal import DAL, Field

try:

    db = DAL('sqlite://test.db', folder='dbs')
    db.define_table('cars', Field('name'), Field('price', 'integer'))

    rows = db(db.cars).select()
    print(rows.as_json())

finally:

    if db:
        db.close()        

该示例以 JSON 格式显示所有行。

$ ./json_output.py 
[{"id": 1, "price": 52642, "name": "Audi"}, 
{"id": 2, "price": 9000, "name": "Skoda"}, 
{"id": 3, "price": 29000, "name": "Volvo"}, 
{"id": 4, "price": 350000, "name": "Bentley"}, 
{"id": 5, "price": 21000, "name": "Citroen"}, 
{"id": 6, "price": 41400, "name": "Hummer"}, 
{"id": 7, "price": 21600, "name": "Volkswagen"}]

pyDAL 最后的 SQL

可以使用 _lastsql 找到 pyDAL 最后执行的 SQL。

lastsql.py
#!/usr/bin/python

from pydal import DAL, Field

try:

    db = DAL('sqlite://test.db', folder='dbs')
    db.define_table('cars', Field('name'), Field('price', 'integer'))

    # we ignore the result
    db(db.cars.id).select(db.cars.name, db.cars.price)

    print(db._lastsql)

finally:

    if db:
        db.close()      

在该示例中,我们在执行 select 语句时打印 pyDAL 执行的 SQL。

$ ./lastsql.py 
('SELECT "cars"."name", "cars"."price" FROM "cars" WHERE ("cars"."id" IS NOT NULL);', 0.0005686283111572266)

此 SQL 由 pyDAL 生成。

pyDAL 执行原始 SQL

我们可以使用 executesql 方法执行原始 SQL。

raw_sql.py
#!/usr/bin/python

from pydal import DAL, Field

try:

    db = DAL('sqlite://test.db', folder='dbs')
    db.define_table('cars', Field('name'), Field('price', 'integer'))

    data = db.executesql('SELECT * FROM cars WHERE id=6')[0]

    print(data)

finally:

    if db:
        db.close() 

在该示例中,我们使用 executesql 执行 SQL SELECT 语句。

$ ./raw_sql.py 
(6, 'Hummer', '41400')

来源

Python pyDAL 文档

在本文中,我们使用 pyDAL 来处理 SQLite 数据库。

作者

我叫 Jan Bodnar,是一位充满热情的程序员,拥有丰富的编程经验。 我从 2007 年开始撰写编程文章。迄今为止,我已经撰写了 1,400 多篇文章和 8 本电子书。 我拥有超过十年的编程教学经验。

列出所有 Python 教程