使用 python 操作数据库,只需要掌握 dataset

使用 python 操作数据库一般使用两种方式。

方式一:通过 pymysql 这样的数据库引擎。它的优势是使用灵活,API 比较底层,自定义程度高。但是每种数据库的操作都需要单独学习用法,如果之前用的 mysql,切换到 Oracle 可能要重新学习另一个库。

方式二:通过 sqlalchemy 这样的 ORM。它的优势是不同数据库通用,而且不需要写 sql 语句,而是通过面向对象的方式编写数据库操作,可读性更强。 但是 ORM 的学习成本比较高,而且通常用在开发,对于小型的脚本施展不开。

dataset 是介于这两者之间的选择。 首先,对于不同的数据库,都有相同的操作,不需要像 pymysql 这样,每换一个数据库就要学习新的内容。 其次,使用起来也非常简单。在以后的数据库操作中,我会多尝试用这个库。

安装

pip install dataset

连接数据库

import dataset

url = 'mysql+pymysql://username:password@8.129.91.153:3306/database'
db = dataset.connect(url)

数据库 URI

数据库的连接信息通过一个标准格式的 URI 表示,只需要遵循以下的写法。

database-uri

sqlite 有点特别,因为它只是本地的文件:

url = 'sqlite:///path/of/mydatabase.db'

获取表

from dataset import Table

table: Table = db['table_name']

查询一条记录

得到的是一个 OrdererDict 排序字典。

record = table.find_one(id=3)

查询多条记录

得到的是 ResultIter 可迭代对象。

record = table.find(id=3)

复杂 sql 语句

因为上面的操作都是基于单表操作,如果涉及到多表操作,或者一些复杂的查询并不实用。 可以使用 db.query。

result = db.query('SELECT type, COUNT(*) c FROM member GROUP BY type')

query 传参数

result = db.query('SELECT mobile_phone, leave_amount FROM member '
                  'WHERE type = :type and leave_amount > :amount',
                  type=1, amount=90000)

完整的流程

import dataset

url = 'mysql+pymysql://future:123456@8.129.91.152:3306/futureloan'
db = dataset.connect(url)
table = db['member']
record = table.find_one(id=3)

插入

info = dict(name='yuz', age=11, phone='18122223333')
success = table.insert(info)

更新

info = dict(name='yuz', age=22, phone='12188889999')
res = table.update(info, keys=['name'])

查找 name 等于 yuz 的记录,把他们的 age 和 phone 修改成新的数据。

事务

with dataset.connect() as db:
    db['user'].insert(dict(name='yuz', age=4=, phone='12188889999')

当操作失败时,所有数据会回滚到之前的记录。上面的操作等价于:

db = dataset.connect()
db.begin()
try:
    db['user'].insert(dict(name='yuz', age=4=, phone='12188889999')
    db.commit()
except:
    db.rollback()

参考