pydbclib是一個通用的python關系型資料庫操作工具包,使用統一的介面操作各種關系型資料庫(如 oracle、mysql、postgres、hive、impala等)進行增刪改查,它是對各個python資料庫連接驅動包(如sqlalchemy、pymysql、cx_Oracle、pyhive、pyodbc、impala等)的封裝,依照python最簡原則SQL占位符統一成 ':[name]' 這一種形式,這點和sqlalchemy是一樣的
安裝
pip3 install pydbclib
簡單使用
看下簡單的查詢示例
from pydbclib import connect # 使用with背景關系,可以自動提交,自動關閉連接 with connect("sqlite:///:memory:") as db: db.execute('create table foo(a integer, b varchar(20))') # 統一使用’:[name]'形式的SQL的占位符 db.execute("insert into foo(a,b) values(:a,:b)", [{"a": 1, "b": "one"}]*4) print(db.read("select * from foo").get_one()) print(db.read("select * from foo").get_all()) print(db.read("select * from foo").to_df()) db.get_table("foo").insert({"a": 2, "b": "two"}) print(db.get_table("foo").find_one({"a": 2})) print(db.get_table("foo").find().get_all()) print(db.get_table("foo").find().to_df())
查詢結果記錄是以字典形式展現,向庫里寫入記錄也是字典形式,如果要使用原生元祖形式,查詢函式read里添加as_dict=False引數
介面檔案
資料庫連接,更多常用資料庫連接方式參考文章結尾
# connect函式有個driver引數決定你是通過哪個資料庫驅動包去連接的 # driver引數默認值是sqlalchemy,即通過sqlalchemy驅動包連接資料庫 >>> db = pydbclib.connect("sqlite:///:memory:") >>> db = pydbclib.connect(":memory:", driver='sqlite3') # 也可以傳入驅動包連接物件 >>> import sqlite3 >>> db = pydbclib.connect(driver=sqlite3.connect(":memory:")) >>> from sqlalchemy import create_engine >>> db = pydbclib.connect(driver=create_engine("sqlite:///:memory:"))
原生SQL介面
1. 使用execute方法執行SQL,和各資料庫連接包基本一致,不同點是它既可以單條執行,也可以批量執行(相當于executemany),另外該方法的SQL占位符是':[name]'形式
>>> record = {"a": 1, "b": "one"}
>>> db.execute('create table foo(a integer, b varchar(20))')
# 插入單條記錄,結果回傳影響行數
>>> db.execute("insert into foo(a,b) values(:a,:b)", record)
1
# 插入多條記錄
>>> db.execute("insert into foo(a,b) values(:a,:b)", [record, record])
2
2. 查詢資料
# 查詢結果只回傳一條記錄 >>> db.read_one("select * from foo") {'a': 1, 'b': 'one'} #read回傳迭代器型別,用get方法獲取前幾條記錄,使用map對每條記錄進行資料清洗 >>> db.read("select * from foo").map(lambda x: {f"foo.{k}": v for k,v in x.items()}).get(2) # as_dict=False回傳原生元祖記錄 >>> db.read("select * from foo", as_dict=False).get(2) [(1, 'one'), (1, 'one')] # 也可以直接for遍歷 >>> for r in db.read("select * from foo"): ... print(r) ... {'a': 1, 'b': 'one'} {'a': 1, 'b': 'one'} {'a': 1, 'b': 'one'} # 轉換成pandas dataframe物件, 前提已經安裝了pandas >>> db.read("select * from foo").to_df() a b 0 1 one 1 1 one 2 1 one
3. 提交、回滾、關閉連接
>>> db.rollback() >>> db.commit() >>> db.close()
表級別操作的SQL介面封裝
1. 插入記錄
# 插入單條和插入多條,輸入引數字典的鍵值必須和表中欄位同名 >>> db.get_table("foo").insert({"a": 1, "b": "one"}) 1 >>> db.get_table("foo").insert([{"a": 1, "b": "one"}]*10) 10
2. 查詢記錄
# 查詢欄位a=1第一條記錄 >>> db.get_table("foo").find_one({"a": 1}) {'a': 1, 'b': 'one'} # 也可以直接寫成sql條件運算式,其他介面的條件引數類似都可以是運算式 >>> db.get_table("foo").find_one("a=1") {'a': 1, 'b': 'one'} # 查詢欄位a=1所有記錄,find回傳迭代器物件同上面read方法 >>> db.get_table("foo").find({"a": 1}).get_all() [{'a': 1, 'b': 'one'},...{'a': 1, 'b': 'one'}]
3. 更新記錄
# 將a=1那條記錄的b欄位值更新為"first" >>> db.get_table("foo").update({"a": 1}, {"b": "first"}) 11 >>> db.get_table("foo").find({"a": 1}).get_one() {'a': 1, 'b': 'first'}
4. 洗掉記錄
# 將a=1那條記錄洗掉 >>> db.get_table("foo").delete({"a": 1}) 11 >>> db.get_table("foo").find({"a": 1}).get_all() []
常用資料庫連接
1. Common Driver
# 使用普通資料庫驅動連接,driver引數指定驅動包名稱 # 例如pymysql包driver='pymysql',connect函式其余的引數和driver引數指定的包的創建連接引數一致 # 連接mysql db = pydbclib.connect(user="user", password="password", database="test", driver="pymysql") # 連接oracle db = pydbclib.connect('user/password@local:1521/xe', driver="cx_Oracle") # 通過odbc方式連接 db = pydbclib.connect('DSN=mysqldb;UID=user;PWD=password', driver="pyodbc") # 通過已有驅動連接方式連接 import pymysql con = pymysql.connect(user="user", password="password", database="test") db = pydbclib.connect(driver=con)
2. Sqlalchemy Driver
# 使用Sqlalchemy包來連接資料庫,drvier引數默認為'sqlalchemy' # 連接oracle db = pydbclib.connect("oracle://user:password@local:1521/xe") # 連接mysql db = pydbclib.connect("mysql+pyodbc://:@mysqldb") # 通過已有engine連接 from sqlalchemy import create_engine engine = create_engine("mysql+pymysql://user:password@localhost:3306/test") db = pydbclib.connect(driver=engine)
使用程序中有任何疑問,歡迎評論交流
專案地址pydbclib
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/140871.html
標籤:Python
