由于python的数据库操作有各种样的第三方库,相互之间使用都会有点差别(比如sql占位符就有'',':','%s'等,该工具的通配符都是":"标准),导致代码在切换数据库时也需要相应改动,应此自己封装了一个通用的库可以用python调用各种类型的数据库并且进一步简化了数据库操作步骤,并且可以自定义扩展
Installation:
pip install py_db
下面都以python内置的sqlite数据库为例
查询操作
from py_db import connection
with connection("test.db", driver="sqlite3") as db:
res1 = db.query("select id, name from test")
res2 = db.dict_query("select id, name from test")
res1返回格式:[(1,"test1"),(2, "test2")]
res2返回格式:[{'id': 1, 'name': 'test1'},{'id': 2, 'name': 'test2'}]
插入更新操作
列表参数:
db.insert("insert into test (id, name) values(:1, :2)", [(1,"test1"),(2, "test2")])
字典参数:
db.insert("insert into test (id, name) values(:id, :name)", [{'id': 1, 'name': 'test1'},{'id': 2, 'name': 'test2'}])
如果你的字典key值和数据库的表能对应上还可以这么写:
db.insert_by_dict('test', [{'id': 1, 'name': 'test1'},{'id': 2, 'name': 'test2'}])
直接传入表名称和对应的字典或字典集合,建议结合pandas做数据采集、处理、入库非常方便
这里只介绍几种最常用的用法,还封装了很多其他功能
可以做自定义操作扩展:
这里是基于sqlalchemy方式来连接的oracle数据库
from py_db import Connection
class MyUDF(Connection):
def total_data(self, table):
return self.query("select count(*) from :1", table)
with MyUDF("oracle://lyt:lyt@local:1521/xe") as db:
count = db.total_data('test')
print("test表的总数量为:", count)
返回的db.connect对象可以作为pandas.read_sql 中的con参数使用
介绍下几个常用连接方式:
connection(host="localhost", user='root', password='password', database='test', driver="pymysql")
pyodbc
connection('DSN=mydb;UID=root;PWD=password', driver="pyodbc")
connection('lyt/lyt@local:1521/xe', driver="cx_Oracle")
sqlalchemy
connection("oracle://lyt:lyt@local:1521/xe")
driver参数默认是以sqlalchemy方式连接,个人也比较喜欢用sqlalchemy的方式连接,应为数据库配置起来方便,看起来清晰简洁,另外基于此包之上和pandas结合开发了简易的python etl工具,目前还不是很完善,仅仅都是支持关系型数据库的,如果有人使用会考虑做的更通用,比如能支持文件,nosql之类的