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