企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
# 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/)。