pyDAL 教程展示了如何使用 pyDAL 数据库抽象层在 Python 中对数据库进行编程。 我们在代码示例中使用 SQLite。
pyDAL
pyDAL 是纯 Python 数据库抽象层。 pyDAL 模块以指定的方言为数据库后端动态生成 SQL。 生成的代码可在不同类型的数据库之间移植。
pyDAL 安装
$ sudo pip3 install pyDAL
我们使用pip3工具安装 pyDAL。
pyDAL 创建数据库表
在下面的示例中,我们创建一个数据库表。
create_table.py
#!/usr/bin/env python3from pydal import DAL, Fielddb = 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()定义。 如果不存在,则创建它。 它有两个字段:名称和价格。 ID 字段会自动生成。
db.cars.insert(name='Audi', price=52642)
我们使用insert()将新行插入表中。 在db连接的cars表上调用该方法。
$ ls dbsc95cf9bab36fcb04c2424cdf9be0f6e3_cars.table sql.log test.db
除了test.db数据库之外,我们还有一个扩展名为.table的迁移文件和一个日志文件。
pyDAL 删除表
使用drop()删除了数据库表。
drop_table.py
#!/usr/bin/env python3from pydal import DAL, Fieldtry: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/env python3from pydal import DAL, Fieldtry: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.py1 Audi 526422 Skoda 90003 Volvo 290004 Bentley 3500005 Citroen 210006 Hummer 414007 Volkswagen 21600
这是输出。
pyDAL 排序
以下示例显示如何使用pyDAL排序数据。
order_by.py
#!/usr/bin/env python3from pydal import DAL, Fieldtry: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.py5 Citroen 210007 Volkswagen 216003 Volvo 290004 Bentley 3500006 Hummer 414001 Audi 526422 Skoda 9000**************************************2 Skoda 90001 Audi 526426 Hummer 414004 Bentley 3500003 Volvo 290007 Volkswagen 216005 Citroen 21000
这是输出。
pyDAL 限制数据输出
可以使用select()方法的limitby参数限制数据输出。
limit_by.py
#!/usr/bin/env python3from pydal import DAL, Fieldtry: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.py3 Volvo 290004 Bentley 3500005 Citroen 21000
这是输出。
pyDAL 计数行
使用count(),我们可以获得表中的行数。
count_rows.py
#!/usr/bin/env python3from pydal import DAL, Fieldtry: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.pyThere are 7 rows in the table
表中有七行。
pyDAL JSON 输出
我们可以使用as_json()获得 JSON 格式的数据。
json_output.py
#!/usr/bin/env python3from pydal import DAL, Fieldtry: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
pyDAL 最后执行的 SQL 可以通过_lastsql()找到。
lastsql.py
#!/usr/bin/env python3from pydal import DAL, Fieldtry:db = DAL('sqlite://test.db', folder='dbs')db.define_table('cars', Field('name'), Field('price', 'integer'))# we ignore the resultdb(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/env python3from pydal import DAL, Fieldtry: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 数据库。
您可能也对以下相关教程感兴趣: PyMongo 教程, Peewee 教程, PyMySQL 教程, SQLite Python 教程和 Python 教程。
