pyDAL
最后修改于 2024 年 1 月 29 日
pyDAL 教程展示了如何使用 pyDAL 数据库抽象层在 Python 中进行数据库编程。 我们在代码示例中使用 SQLite。
pyDAL
pyDAL 是一个纯 Python 数据库抽象层。 pyDAL 模块动态地为数据库后端生成指定方言的 SQL。 生成的代码将在不同类型的数据库之间具有可移植性。
pyDAL 安装
$ sudo pip3 install pyDAL
我们使用 pip3
工具来安装 pyDAL。
pyDAL 创建数据库表
在下面的示例中,我们创建一个数据库表。
#!/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
删除。
#!/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
选择。
#!/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
对数据进行排序。
#!/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
参数来限制。
#!/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
,我们可以获取表中的行数。
#!/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 格式获取数据。
#!/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。
#!/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。
#!/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')
来源
在本文中,我们使用 pyDAL 来处理 SQLite 数据库。
作者
列出所有 Python 教程。