1 github链接为:https://github.com/kennethreitz/records
2 1)SQLite 数据库连接串:
3 sqlite:///:memory: (or, sqlite://)
4 sqlite:///relative/path/to/file.db
5 sqlite:////absolute/path/to/file.db
6 例:db = records.Database(‘sqlite:///users.db’)
7 2)Oracle 数据库连接示例:
8 先安装 cx_Oracle
9 oracle://root:1234@ORCL
10 3)MySQL 数据库连接串示例:
11 mysql://root:12345@localhost/mydb?charset=utf8
12 4)PostgreSQL 数据库连接串示例:
13 postgresql://postgres:1234@localhost/mydb
14 5)SQL Server 数据库连接示例:
15 首先安装 pymssql
16 mssql+pymssql://sa:12345@localhost:1433/mydb
17 注意:
18 有些数据库连接方式因第三方模块不同,连接方式可能有多种,上述只是展示其中某一种连接方式,更详细的连接方式请参考 SQLAlchemy。
1 使用步骤:
2 连接数据库,返回 db 数据库对象
3 db 对象执行 sql 语句
4 # pip install records 安装
5 import records
6 # 获取数据库
7 db = records.Database('mysql+pymysql://root:@localhost:3306/dev01_git')
8 # 查询
9 rows = db.query('select * from lemon_user') # 获取数据库的格式是标准的 URL 格式,如果使用的不是 mysql 数据库,只需要换掉数据库类型就可以了
1 二、创建表
2 # 连接数据库
3 db = records.Database('mysql+pymysql://root:@localhost:3306/dev01_git')
4
5 # 创建表
6 sql_create_table = """CREATE TABLE IF NOT EXISTS lemon_user (
7 name varchar(20),
8 age int
9 ) DEFAULT CHARSET=utf8 ;"""
10
11 db.query(sql_create_table)
12
13
14 三、插入单条数据
15 records 支持使用:variable 定义变量,通过参数传入完成动态传值,在需要动态加载数据的时候非常有用:
16
17 user = {"name": "yuze5", "age": 20}
18 db.query('INSERT INTO lemon_user(name,age) values (:name, :age)', **user)
19
20 四、插入多条数据
21 sql 语句在执行多条数据操作的时候非常不方便,尤其是当值还是变化的时候。 records 提供的 bulk_query 方法能快捷的插入和更新多条数据:
22
23 users = [
24 {"name":"yuze", "age": 13},
25 {"name":"yuze2", "age": 15},
26 {"name":"yuze3", "age": 16}
27 ]
28 db.bulk_query('INSERT INTO lemon_user(name,age) values (:name, :age)', users)
29
30 五、数据查询
31 查询到数据以后,可以通过 all() 方法获取所有的记录,支持 3 种类型。默认是自己封装的 RecordCollection 对象,也可以通过 as_dict=True 参数转成字典形式,可以通过 as_ordereddict=True 转成排序字典形式
32
33 rows = db.query('SELECT * FROM lemon_user;')
34 # 得到所有数据
35 print(rows.all())
36 # 字典形式展示
37 print(rows.all(as_dict=True))
38 # 获取第一个
39 print(rows.first())
40 # 以字典形式获取第一个
41 print(rows.first(as_dict=True))
42 # 排序字典
43 print(rows.first(as_ordereddict=True))
44 # 查询唯一的一个
45 print(rows.one())
46 # 转为表格形式
47 print(rows.dataset)
48 # 转为json
49 print(rows.as_dict())
50 # 遍历
51 for r in rows:
52 # 多种获取方式
53 print(r.id, r['uname'], r[2])
54
56
57 安全参数化:
58 # Records 支持安全参数化,使用 :variable 定义变量,使用字典传入参数值
59 params = {'id':1}
60 rows = db.query('select * from a_user where id = :id',**params)
61
62
64
65 六、简洁的数据库事务支持
66 数据库事务是经常需要使用到的数据库操作,他通常是为了保持数据原子性和一致性。
67 比如一个转账的数据库操作:
68 1、从 yuze 账号中读取余额 ,
69 2、对 yuze 账号余额减去转账 - 400
70 3、从 chaoge 账号中把余额读出来
71 4、对 chaoge 账号做加法操作(+400)。我们必须保证这 4 步同时执行成功,要么同时都不成功。如果前 2 步已经执行成功,但是到第 3 步发生了错误导致后面都不能执行,就会出现问题:yuze 的账号被扣了钱,但是 chaoge 的账号却没有加钱。通过数据库事务就能避免这种情况。
72
73 with db.transaction() as tx:
74 user = {"name": "yuze9", "age": 20}
75 tx.query('INSERT INTO lemon_user(name,age) values (:name, :age)', **user)
76 # 下面是错误的 sql 语句,有错误,则上面的 sql 语句不会成功执行。
77 tx.query('sof')
1 事务支持:
2 t = Database.transaction();
3 t.commit()
4
5
6 demo:
7 db = records.Database()
8 tx = db.transaction()
9 try:
10 db.query(...)
11 db.query(...)
12 tx.commit()
13 except:
14 tx.rollback()
1 数据导出功能:
2 Records 还具有完整的 Tablib 集成功能,允许将结果导出到 CSV、XLS、JSON、HTML Tables, YAML、Pandas DataFrames。非常适合与朋友共享数据或生成报告。
3
4 1. 以 dataset 方式导出
5 dataset = rows.dataset
6 print(dataset)
7
8 结果:
9 id|cid|uname
10 --|---|------
11 1 |100|tom1
12 2 |100|cat1
13
14 2. 以 csv 方式导出:结果以逗号分隔
15 csv = rows.export('csv')
16 print(csv)
17
18 结果:
19 id,cid,uname
20 1,100,tom1
21 2,100,cat1
22
23 3. 以 yaml 方式导出
24 yaml = rows.export('yaml')
25 print(yaml)
26
27 结果:
28 - cid: 100
29 id: 1
30 uname: tom1
31 - cid: 100
32 id: 2
33 uname: cat1
34
35 4. 以 JSON 方式导出:js对象表示法
36 jn = rows.export('json')
37 print(jn)
38
39 结果:
40 [{"id": 1, "cid": 100, "uname": "tom1"}, {"id": 2, "cid": 100, "uname": "cat1"}]
41
42 demo:
43 rows = db.query('SELECT * FROM lemon_user;')
44 json_rows = rows.export('yaml')
45 print(json_rows)
46
47 # 把数据写入yaml 文件里面
48 with open("222.yaml", "w", encoding="utf-8") as f:
49 f.write(json_rows)
50
51
52
53 5. 以 xls/xlsx 方式导出
demo1
54 xls = rows.export('xls')
55 print(xls) # b'\xd0\xcf\x11\xe0\xa1\xb1.......'
56
demo2
57 with open('E://report.xls', 'wb') as f:
58 f.write(rows.export('xls'))
59 demo3
60 rows = db.query('SELECT * FROM lemon_user;')
61 with open('users.xlsx', 'wb') as f:
62 f.write(rows.export('xlsx'))
63
64
65 6. 以Pandas DataFrame 方式导出
66 首先安装好 pandas 模块。
67 rows = db.query('select * from a_user')
68 df = rows.export('df')
69 print(df)
70
71 结果:
72 id cid uname
73 0 1 100 tom1
74 1 2 100 cat1
75 2 3 100 kitty1