dataset库是Python中一个用于操作数据库的简单库,它提供了一种简洁的方式与各种关系型数据库进行交互,例如SQLite、MySQL、PostgreSQL 等。你可以使用dataset库来执行查询、插入、更新和删除操作,而无需编写复杂的SQL语句。dataset库适用于小规模的数据存储和查询场景,相比csv和json文件只能通过编程语言来处理数据,dataset支持使用SQL语言进行查询,提供了丰富的查询功能和灵活性。对于大规模数据和高并发场景,专业数据库系统如MySQL、PostgreSQL等更具优势。
dataset官方仓库地址:dataset。dataset官方文档地址:dataset-doc。安装命令如下:
pip install dataset
import dataset
# 查看版本
dataset.__version__
'1.6.2'
1 使用说明
1.1 数据库操作
数据库创建
connect函数是dataset库中用于连接到数据库并返回一个数据库对象。它的使用方式如下:
|
|
|
|
|
db = dataset.connect('sqlite:///mydatabase.db') |
|
|
|
|
|
|
|
|
表格查询与创建
dataset提供get_table函数或直接表名索引来创建或加载一个表格。同时,dataset也提供create_table函数创建一个新的表格,也可以使用load_table函数加载现有的表格。
|
|
|
|
|
table = db.create_table('mytable') |
此外也可以指定表格创建时的各种参数,dataset主要支持类型有:
- db.types.integer:表示整数类型。
- db.types.float:表示浮点数类型。
- db.types.boolean:表示布尔类型。
- db.types.datetime:表示日期时间类型。
- db.types.date:表示日期类型。
- db.types.text:表示文本字符串类型。
|
|
|
table = db.load_table('mytable') |
|
|
|
|
直接在数据库上运行sql查询语句
dataset库提供query函数用于过滤和查询数据集。它接受一个字符串参数,该参数表示一条 SQL 查询语句,用于选择符合条件的数据。
1.2 表格操作
插入数据
insert用于插入数据。
|
|
|
data = {'name': 'John', 'age': 25, 'email': 'john@example.com'} |
|
table.insert(data) |
|
|
|
table.insert(dict(name='Alice', age=25)) |
insert_ignore用于插入一行数据,但只有在keys中列的值不重复时才会插入。
|
table.insert_ignore(dict(name='Alice', age=25),keys=['name']) |
insert_many函数用于向数据库表中批量插入数据。它接受一个列表作为参数,该列表中的每个元素都是一个字典,表示要插入的一行数据。使用该函数要比逐个添加快很多。
|
data = [ |
|
{'name': 'John', 'age': 25, 'city': 'New York'}, |
|
{'name': 'Alice', 'age': 30, 'city': 'Los Angeles'}, |
|
{'name': 'Bob', 'age': 35, 'city': 'San Francisco'} |
|
] |
|
table.insert_many(data) |
插入列
|
|
|
|
|
|
|
table.create_column('food', db.types.text) |
|
|
|
table.create_column_by_example('length', 4.2) |
查看数据
|
|
|
data = list(table.all()) |
|
|
|
|
|
for row in data: |
|
print(row) |
|
OrderedDict([('id', 1), ('name', 'John'), ('age', 25), ('email', 'john@example.com'), ('city', None), ('food', None), ('length', None)]) |
|
OrderedDict([('id', 2), ('name', 'Alice'), ('age', 25), ('email', None), ('city', None), ('food', None), ('length', None)]) |
|
OrderedDict([('id', 3), ('name', 'John'), ('age', 25), ('email', None), ('city', 'New York'), ('food', None), ('length', None)]) |
|
OrderedDict([('id', 4), ('name', 'Alice'), ('age', 30), ('email', None), ('city', 'Los Angeles'), ('food', None), ('length', None)]) |
|
OrderedDict([('id', 5), ('name', 'Bob'), ('age', 35), ('email', None), ('city', 'San Francisco'), ('food', None), ('length', None)]) |
|
|
|
for row in table: |
|
print(row) |
|
OrderedDict([('id', 1), ('name', 'John'), ('age', 25), ('email', 'john@example.com'), ('city', None), ('food', None), ('length', None)]) |
|
OrderedDict([('id', 2), ('name', 'Alice'), ('age', 25), ('email', None), ('city', None), ('food', None), ('length', None)]) |
|
OrderedDict([('id', 3), ('name', 'John'), ('age', 25), ('email', None), ('city', 'New York'), ('food', None), ('length', None)]) |
|
OrderedDict([('id', 4), ('name', 'Alice'), ('age', 30), ('email', None), ('city', 'Los Angeles'), ('food', None), ('length', None)]) |
|
OrderedDict([('id', 5), ('name', 'Bob'), ('age', 35), ('email', None), ('city', 'San Francisco'), ('food', None), ('length', None)]) |
|
['id', 'name', 'age', 'email', 'city', 'food', 'length'] |
查找数据
|
|
|
results = table.find(name='John') |
|
|
|
for row in results: |
|
print(row['name'], row['city']) |
|
|
|
results = table.find(name='John',city=None) |
|
|
|
for row in results: |
|
print(row['name'], row['city']) |
|
|
|
results = table.find_one(name='John') |
|
results |
|
OrderedDict([('id', 1), |
|
('name', 'John'), |
|
('age', 25), |
|
('email', 'john@example.com'), |
|
('city', None), |
|
('food', None), |
|
('length', None)]) |
|
|
|
results = table.find(id=[1, 2, 4]) |
|
|
|
for row in results: |
|
print(row['name'], row['city']) |
|
John None |
|
Alice None |
|
Alice Los Angeles |
|
|
|
results = table.find(age={'>=': 30}) |
|
for row in results: |
|
print(row['name'], row['age']) |
|
|
|
results = table.find(age={'between': [21, 30]}) |
|
for row in results: |
|
print(row['name'], row['age']) |
|
John 25 |
|
Alice 25 |
|
John 25 |
|
Alice 30 |
|
|
|
results = table.distinct('name') |
|
for row in results: |
|
print(row) |
|
OrderedDict([('name', 'Alice')]) |
|
OrderedDict([('name', 'Bob')]) |
|
OrderedDict([('name', 'John')]) |
dataset库还支持更丰富的查询操作,具体可以查看文档:dataset-query。
更新数据
update函数用于更新单条记录。
|
|
|
|
|
|
|
affected_rows = table.update(dict(name= 'John',age=23,email="qq.com"), keys=['name']) |
|
print("受影响的行数:", affected_rows) |
|
|
|
data = list(table.all()) |
|
|
|
|
|
for row in data: |
|
print(row) |
|
OrderedDict([('id', 1), ('name', 'John'), ('age', 23), ('email', 'qq.com'), ('city', None), ('food', None), ('length', None)]) |
|
OrderedDict([('id', 2), ('name', 'Alice'), ('age', 25), ('email', None), ('city', None), ('food', None), ('length', None)]) |
|
OrderedDict([('id', 3), ('name', 'John'), ('age', 23), ('email', 'qq.com'), ('city', 'New York'), ('food', None), ('length', None)]) |
|
OrderedDict([('id', 4), ('name', 'Alice'), ('age', 30), ('email', None), ('city', 'Los Angeles'), ('food', None), ('length', None)]) |
|
OrderedDict([('id', 5), ('name', 'Bob'), ('age', 35), ('email', None), ('city', 'San Francisco'), ('food', None), ('length', None)]) |
update_many也被提供用于批量更新数据。
|
|
|
rows = [ |
|
{'name': 'Alice', 'age': 123}, |
|
{'name': 'Bob', 'age': 18} |
|
] |
|
|
|
table.update_many(rows,keys=['name']) |
此外也可以用upsert和upsert_many插入更新单条或多条记录,即如果存在具有匹配关键字的行,则这些行将被更新,否则将在表中插入新行。具体使用类似update和update_many。
删除数据
delete函数用于删除行,如下所示:
|
for row in table: |
|
print(row) |
|
OrderedDict([('id', 1), ('name', 'John'), ('age', 23), ('email', 'qq.com'), ('city', None), ('food', None), ('length', None)]) |
|
OrderedDict([('id', 2), ('name', 'Alice'), ('age', 123), ('email', None), ('city', None), ('food', None), ('length', None)]) |
|
OrderedDict([('id', 3), ('name', 'John'), ('age', 23), ('email', 'qq.com'), ('city', 'New York'), ('food', None), ('length', None)]) |
|
OrderedDict([('id', 4), ('name', 'Alice'), ('age', 123), ('email', None), ('city', 'Los Angeles'), ('food', None), ('length', None)]) |
|
OrderedDict([('id', 5), ('name', 'Bob'), ('age', 18), ('email', None), ('city', 'San Francisco'), ('food', None), ('length', None)]) |
|
|
|
table.delete(age=23) |
|
for row in table: |
|
print(row) |
|
OrderedDict([('id', 2), ('name', 'Alice'), ('age', 123), ('email', None), ('city', None), ('food', None), ('length', None)]) |
|
OrderedDict([('id', 4), ('name', 'Alice'), ('age', 123), ('email', None), ('city', 'Los Angeles'), ('food', None), ('length', None)]) |
|
OrderedDict([('id', 5), ('name', 'Bob'), ('age', 18), ('email', None), ('city', 'San Francisco'), ('food', None), ('length', None)]) |
|
|
|
table.delete(age=30, name='John') |
|
for row in table: |
|
print(row) |
|
OrderedDict([('id', 2), ('name', 'Alice'), ('age', 123), ('email', None), ('city', None), ('food', None), ('length', None)]) |
|
OrderedDict([('id', 4), ('name', 'Alice'), ('age', 123), ('email', None), ('city', 'Los Angeles'), ('food', None), ('length', None)]) |
|
OrderedDict([('id', 5), ('name', 'Bob'), ('age', 18), ('email', None), ('city', 'San Francisco'), ('food', None), ('length', None)]) |
|
|
|
table.delete(age={'>=': 30}) |
|
for row in table: |
|
print(row) |
|
OrderedDict([('id', 5), ('name', 'Bob'), ('age', 18), ('email', None), ('city', 'San Francisco'), ('food', None), ('length', None)]) |
drop_column函数会从数据集中删除指定的列,如下所示:
1.3 事务操作
事务是一组数据库操作,要么全部成功执行,要么全部回滚。这可以确保数据的一致性和完整性。下面代码展示了如何创建一个事务对象。在这种情况下,所有更新都会立即提交,或者,在出现异常的情况下,立即回滚所有操作。事务通过上下文管理器得到支持,因此可以通过with语句使用:
|
with dataset.connect('sqlite:///mydatabase.db') as tx: |
|
|
|
|
|
|
|
tx['user'].insert(dict(name='John Doe', age=46, country='China')) |
当然以上代码可以显式调用函数begin、commit和rollback来获得相同的功能:
|
db = dataset.connect('sqlite:///mydatabase.db') |
|
db.begin() |
|
try: |
|
db['user'].insert(dict(name='John Doe', age=46, country='China')) |
|
db.commit() |
|
except: |
|
db.rollback() |
除此之外,也支持嵌套事务如下所示:
|
db = dataset.connect() |
|
with db as tx1: |
|
tx1['user'].insert(dict(name='John Doe', age=46, country='China')) |
|
with db as tx2: |
|
tx2['user'].insert(dict(name='Jane Doe', age=37, country='France', gender='female')) |