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