原文: http://zetcode.com/python/pydal/

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

pyDAL

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

pyDAL 安装

  1. $ sudo pip3 install pyDAL

我们使用pip3工具安装 pyDAL。

pyDAL 创建数据库表

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

create_table.py

  1. #!/usr/bin/env python3
  2. from pydal import DAL, Field
  3. db = DAL('sqlite://test.db', folder='dbs')
  4. try:
  5. db.define_table('cars', Field('name'), Field('price', type='integer'))
  6. db.cars.insert(name='Audi', price=52642)
  7. db.cars.insert(name='Skoda', price=9000)
  8. db.cars.insert(name='Volvo', price=29000)
  9. db.cars.insert(name='Bentley', price=350000)
  10. db.cars.insert(name='Citroen', price=21000)
  11. db.cars.insert(name='Hummer', price=41400)
  12. db.cars.insert(name='Volkswagen', price=21600)
  13. finally:
  14. if db:
  15. db.close()

该示例创建一个具有七行的cars表。

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

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

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

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

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

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

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

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

pyDAL 删除表

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

drop_table.py

  1. #!/usr/bin/env python3
  2. from pydal import DAL, Field
  3. try:
  4. db = DAL('sqlite://test.db', folder='dbs')
  5. cars = db.define_table('cars', Field('name'), Field('price', 'integer'))
  6. cars.drop()
  7. finally:
  8. if db:
  9. db.close()

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

pyDAL 选择行

使用select()选择表行。

select_all_rows.py

  1. #!/usr/bin/env python3
  2. from pydal import DAL, Field
  3. try:
  4. db = DAL('sqlite://test.db', folder='dbs')
  5. db.define_table('cars', Field('name'), Field('price'))
  6. rows = db().select(db.cars.ALL)
  7. for row in rows:
  8. print("{} {} {}".format(row['id'], row['name'], row['price']))
  9. finally:
  10. if db:
  11. db.close()

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

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

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

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

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

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

这是输出。

pyDAL 排序

以下示例显示如何使用pyDAL排序数据。

order_by.py

  1. #!/usr/bin/env python3
  2. from pydal import DAL, Field
  3. try:
  4. db = DAL('sqlite://test.db')
  5. db.define_table('cars', Field('name'), Field('price', 'integer'))
  6. rows = db(db.cars).select(orderby=db.cars.price)
  7. for row in rows:
  8. print("{} {} {}".format(row['id'], row['name'], row['price']))
  9. print("**************************************")
  10. rows = db(db.cars).select(orderby=~db.cars.price)
  11. for row in rows:
  12. print("{} {} {}".format(row['id'], row['name'], row['price']))
  13. finally:
  14. if db:
  15. db.close()

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

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

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

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

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

  1. $ ./order_by.py
  2. 5 Citroen 21000
  3. 7 Volkswagen 21600
  4. 3 Volvo 29000
  5. 4 Bentley 350000
  6. 6 Hummer 41400
  7. 1 Audi 52642
  8. 2 Skoda 9000
  9. **************************************
  10. 2 Skoda 9000
  11. 1 Audi 52642
  12. 6 Hummer 41400
  13. 4 Bentley 350000
  14. 3 Volvo 29000
  15. 7 Volkswagen 21600
  16. 5 Citroen 21000

这是输出。

pyDAL 限制数据输出

可以使用select()方法的limitby参数限制数据输出。

limit_by.py

  1. #!/usr/bin/env python3
  2. from pydal import DAL, Field
  3. try:
  4. db = DAL('sqlite://test.db', folder='dbs')
  5. db.define_table('cars', Field('name'), Field('price', 'integer'))
  6. rows = db(db.cars).select(limitby=(2, 5))
  7. for row in rows:
  8. print("{} {} {}".format(row['id'], row['name'], row['price']))
  9. finally:
  10. if db:
  11. db.close()

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

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

这是输出。

pyDAL 计数行

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

count_rows.py

  1. #!/usr/bin/env python3
  2. from pydal import DAL, Field
  3. try:
  4. db = DAL('sqlite://test.db', folder='dbs')
  5. db.define_table('cars', Field('name'), Field('price', 'integer'))
  6. n = db(db.cars.id).count()
  7. print("There are {} rows in the table".format(n))
  8. finally:
  9. if db:
  10. db.close()

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

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

表中有七行。

pyDAL JSON 输出

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

json_output.py

  1. #!/usr/bin/env python3
  2. from pydal import DAL, Field
  3. try:
  4. db = DAL('sqlite://test.db', folder='dbs')
  5. db.define_table('cars', Field('name'), Field('price', 'integer'))
  6. rows = db(db.cars).select()
  7. print(rows.as_json())
  8. finally:
  9. if db:
  10. db.close()

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

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

这是输出。

pyDAL 最后一个 SQL

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

lastsql.py

  1. #!/usr/bin/env python3
  2. from pydal import DAL, Field
  3. try:
  4. db = DAL('sqlite://test.db', folder='dbs')
  5. db.define_table('cars', Field('name'), Field('price', 'integer'))
  6. # we ignore the result
  7. db(db.cars.id).select(db.cars.name, db.cars.price)
  8. print(db._lastsql)
  9. finally:
  10. if db:
  11. db.close()

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

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

该 SQL 由 pyDAL 生成。

pyDAL 执行原始 SQL

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

raw_sql.py

  1. #!/usr/bin/env python3
  2. from pydal import DAL, Field
  3. try:
  4. db = DAL('sqlite://test.db', folder='dbs')
  5. db.define_table('cars', Field('name'), Field('price', 'integer'))
  6. data = db.executesql('SELECT * FROM cars WHERE id=6')[0]
  7. print(data)
  8. finally:
  9. if db:
  10. db.close()

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

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

这是输出。

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

您可能也对以下相关教程感兴趣: PyMongo 教程Peewee 教程PyMySQL 教程SQLite Python 教程Python 教程