records
簡單了解:
records:SQL for Humans™ https://pypi.python.org/pypi/records/
Records 是一個非常簡單但功能強大的庫,用於對大多數關系數據庫進行原始SQL查詢。
只需編寫SQL。沒有鍾聲,沒有哨聲。使用可用的標准工具,這一常見任務可能會令人驚訝地困難。該庫努力使此工作流程盡可能簡單,同時提供一個優雅的界面來處理您的查詢結果。
數據庫支持包括RedShift,Postgres,MySQL,SQLite,Oracle和MS-SQL(不包括驅動程序)。
安裝:pip install records
使用:
調用 records.Database(......)
連接數據庫,返回<Database open=True>
數據庫對象<Database open=True>
對象執行 sql 語句,詳細見下。
1、連接數據庫:
import records
# 連接數據庫
db = records.Database('mysql://root:xuyang@localhost:3306/ceshi?charset=utf8mb4', pool_recycle=3600) # MySQL默認連接8小時后自動斷連,加參數pool_recycle每一小時重連 A Database. Encapsulates a url and an SQLAlchemy engine with a pool of connections.
print(db) # <Database open=True> 對象
# --------------------------
print(db.get_table_names()) # Returns a list of table names for the connected database.
print(db.get_connection) # Get a connection to this Database. Connections are retrieved from a pool.
2、刪除表
table_name = 'userinfo' # 數據表的表名
drop_table_sql = """drop table if exists {};""".format(table_name)
db.query(drop_table_sql)
3、創建表
create_table_sql = """create table if not exists {} (
name varchar(20),
age int
) default charset=utf8;""".format(table_name)
db.query(create_table_sql)
4、插入數據
- 插入單條
# records 支持使用 :variable 定義變量,通過參數傳入完成動態傳值,在需要動態加載數據的時候非常有用:
user = {"name": "user0", "age": 20}
db.query('insert into userinfo(name, age) values(:name, :age)', **user)
- 插入多條
# records 提供的 bulk_query 方法能快捷的插入和更新多條數據:
users = [
{"name":"user1", "age": 21},
{"name":"user2", "age": 22},
{"name":"user3", "age": 23}
]
db.bulk_query('insert into userinfo(name, age) values(:name, :age)', users)
5、查詢數據
rows = db.query('select * from userinfo;')
# print(rows) # <RecordCollection size=0 pending=True>
# print(rows.all()) # 默認是自己封裝的 RecordCollection 對象:[<Record {"name": "user0", "age": 20}>, <Record {"name": "user1", "age": 21}>, <Record {"name": "user2", "age": 22}>, <Record {"name": "user3", "age": 23}>]
# print(rows.all(as_dict=True)) # 可以通過 as_dict=True 參數轉成 字典形式:[{'name': 'user0', 'age': 20}, {'name': 'user1', 'age': 21}, {'name': 'user2', 'age': 22}, {'name': 'user3', 'age': 23}]
# print(rows.all(as_ordereddict=True)) # 通過 as_ordereddict=True 轉成 排序字典形式:[OrderedDict([('name', 'user0'), ('age', 20)]), OrderedDict([('name', 'user1'), ('age', 21)]), OrderedDict([('name', 'user2'), ('age', 22)]), OrderedDict([('name', 'user3'), ('age', 23)])]
# print(rows.first()) # <Record {"name": "user0", "age": 20}>
# print(rows.first(as_dict=True)) # {'name': 'user0', 'age': 20}
# print(rows.first(as_ordereddict=True)) # OrderedDict([('name', 'user0'), ('age', 20)])
# # print(rows.one()) # 查詢唯一的一個。我自己這里報錯
userinfo_dict = rows.as_dict() # 轉換成 字典
print(userinfo_dict[0]['age']) # 20
# 可 遍歷 rows
for row in rows:
print(row.name)
6、數據導出為 json
print(rows.export('json'))
json_rows = rows.export('yaml')
print(json_rows)
# ------------------------------
with open('userinfo.json', 'w') as fp:
fp.write(rows.export('json'))
輸出如下:
[{"name": "user0", "age": 20}, {"name": "user1", "age": 21}, {"name": "user2", "age": 22}, {"name": "user3", "age": 23}]
- {age: 20, name: user0}
- {age: 21, name: user1}
- {age: 22, name: user2}
- {age: 23, name: user3}
7、數據導出到 Excel 文件
with open('userinfo.xlsx', 'wb') as f:
f.write(rows.export('xlsx'))
8、轉為表格形式
print(rows.dataset)
輸出如下:
name |age
-----|---
user0|20
user1|21
user2|22
user3|23