# pyDAL 教程

> 原文： [http://zetcode.com/python/pydal/](http://zetcode.com/python/pydal/)

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

## pyDAL

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

## pyDAL 安装

```py
$ sudo pip3 install pyDAL

```

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

## pyDAL 创建数据库表

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

`create_table.py`

```py
#!/usr/bin/env python3

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`表。

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

```

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

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

```

数据库表由`define_table()`定义。 如果不存在，则创建它。 它有两个字段：名称和价格。 ID 字段会自动生成。

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

```

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

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

```

除了`test.db`数据库之外，我们还有一个扩展名为`.table`的迁移文件和一个日志文件。

## pyDAL 删除表

使用`drop()`删除了数据库表。

`drop_table.py`

```py
#!/usr/bin/env python3

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`

```py
#!/usr/bin/env python3

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`表中检索所有行。

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

```

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

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

```

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

```py
$ ./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`

```py
#!/usr/bin/env python3

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()         

```

该示例打印表中的所有行，并按价格升序和降序对其进行排序。

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

```

通过`select()`方法的`orderby`参数进行排序。

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

```

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

```py
$ ./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`

```py
#!/usr/bin/env python3

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 的三行。

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

```

这是输出。

## pyDAL 计数行

使用`count()`，我们可以获得表中的行数。

`count_rows.py`

```py
#!/usr/bin/env python3

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`表中的行数。

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

```

表中有七行。

## pyDAL JSON 输出

我们可以使用`as_json()`获得 JSON 格式的数据。

`json_output.py`

```py
#!/usr/bin/env python3

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 格式显示所有行。

```py
$ ./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

pyDAL 最后执行的 SQL 可以通过`_lastsql()`找到。

`lastsql.py`

```py
#!/usr/bin/env python3

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。

```py
$ ./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`

```py
#!/usr/bin/env python3

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`语句。

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

```

这是输出。

在本教程中，我们使用 pyDAL 处理 SQLite 数据库。

您可能也对以下相关教程感兴趣： [PyMongo 教程](/python/pymongo/)， [Peewee 教程](/python/peewee/)， [PyMySQL 教程](/python/pymysql/)， [SQLite Python 教程](/db/sqlitepythontutorial/)和 [Python 教程](/lang/python/)。