python通用資料庫操作工具 pydbclib

来源:https://www.cnblogs.com/liyatao/archive/2020/06/01/13027304.html
-Advertisement-
Play Games

pydbclib是一個通用的python關係型資料庫操作工具包,使用統一的介面操作各種關係型資料庫(如 oracle、mysql、postgres、hive、impala等)進行增刪改查,它是對各個python資料庫連接驅動包(如sqlalchemy、pymysql、cx_Oracle、pyhive ...


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


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • jquery判斷checked的三種方法: .attr('checked); //看版本1.6+返回:”checked”或”undefined” ;1.5-返回:true或false .prop('checked'); //16+:true/false .is(':checked'); //所有版本 ...
  • 概述 Express是目前最流行的基於Node.js的Web開發框架,可以快速地搭建一個完整功能的網站。 Express上手非常簡單,首先新建一個項目目錄,假定叫做hello-world。 $ mkdir hello-world 進入該目錄,新建一個package.json文件,內容如下。 { "n ...
  • 觀察者模式是一種經常使用的設計模式,在軟體系統中對象並不是孤立存在的,一個對象行為的改變可能會導致其他與之存在依賴關係的對象行為發生改變,觀察者模式用於描述對象之間的依賴關係。 模式動機 很多情況下,對象不是孤立存在的,想象這麼一個場景:你和女朋友去旅行,晚上回到賓館,女朋友穿著厚厚的大衣,從外表看 ...
  • Java生鮮電商平臺-生鮮電商數據分析思維以及指標(小程式/APP) 說明:在生鮮電商行業火爆和轉型的背後,數據分析往往成了主要的助推劑之一,通過對商品、用戶、平臺數據的分析,商家就能知道什麼樣的商品好賣,什麼樣的人愛買,哪一類的促銷活動更受歡迎等等,從而對症下藥調整策略,精準營銷。於是,近年來電商 ...
  • 1、數據類型 go語言支持的基礎類型: 整型:int,int8,int16,int32,int64 無符號整型:uint,uint8,uint16,uint32,uint64 其中預設類型為int,int表示32位或64位與操作系統有關 位元組:byte 布爾:bool 浮點型:float32,flo ...
  • Java中內置類及其方法的使用通常翻閱對應的API文檔即可,但是對於常用的一些類和方法還是需要我們能夠熟練的使用。 一、System System.gc():手動啟動垃圾回收器,垃圾回收器通常是自動啟動的,某些時候Java可能覺得當下的情況並不需要啟動gc,但是你又想啟動的話,就可以調用這個方法手動 ...
  • python2 預設的編碼方式是ASCII碼 在文件的首行:#-- encoding:utf-8 -- python3 預設編碼方式utf-8 0、列印內容 print () print('Hellow World !') 1、變數 變數:就是將一些運算的中間結果暫存到記憶體中,以便後續代碼調用。 必 ...
  • *6.38(生成隨機字元)使用程式清單6-10RandomCharacter中的方法,列印100個大寫字母及100個一位數字,每行列印10個。 *6.38(Generate random characters) Use the methods in RandomCharacter in Listin ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...