由于python的数据库操作有各种样的第三方库,相互之间使用都会有点差别(比如sql占位符就有’?’,’:’,’%s’等,该工具的通配符都是”:”标准),导致代码在切换数据库时也需要相应改动,应此自己封装了一个通用的库可以用python调用各种类型的数据库并且进一步简化了数据库操作步骤,并且可以自定义扩展
安装
pip install pydbclib
下面都以python内置的sqlite数据库为例
读操作(DQL)
from pydbclib import connection
with connection('test.db',driver='sqlite3') as db:
rs1=db.read('select id,name from test')
rs2=db.read_dict('select id,name from test')
# rs1返回格式:[(1,'test1'),(2,'test2')]
# rs2返回格式:[{'id':1,'name':'test1'},{'id':2,'name':'test2'}]
写操作(DML)
所有写操作都会返回数据库受影响行数
# 列表参数
db.write('insert into test(id,name) values(:1,:2)',[(1,'test1'),(2,'test2')])
# 字典参数
db.write('insert into test(id,name) values(:id,:name)',
[{'id':1,'name':'test1'},{'id':2,'name':'test2'}])
# 如果你的字典key值和数据库的表能对应上就可以这么写
db.write_by_dict('test',[{'id':1,'name':'test1'},{'id':2,'name':'test2'}])
db.merge('test',[{'id':2,'name':'tow'},{'id':3,'name':'test3'}],
unique=['id'])
DDL
db.ddl('create table test(id varchar(4),name varchar(10))')
db.ddl('drop table test')
自定义扩展函数
这里基于sqlalchemy方式来连接的oracle数据库
from pydbclib import Connection
class MyUDF(Connection):
def total_data(self, table):
return self.read('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参数使用
常用数据库连接方式
实际参数视具体使用的驱动程序(配置的driver参数)
# pymysql连接mysql
connection(host='localhost',user='root',password='password',database='test',driver='pymysql')
# pyodbc连接odbc驱动
connection('DSN=mydb;UID=root;PWD=password',driver='pyodbc')
# cx_Oracle连接oracle
connection('lyt/lyt@local:1521/xe',driver='cx_Oracle')
# sqlalchemy连接oracle
connection('oracle://lyt:lyt@local:1521/xe')
connection工厂的driver参数默认是以sqlalchemy方式连接,个人也比较喜欢用sqlalchemy驱动的方式连接,应为数据库连接配置起来方便,看起来清晰简洁,是一个比较好的数据通用连接标准,另外基于此包之上和pandas结合开发了小数据量简易的python etl工具,支持UDF操作,目前还不是很完善,仅仅都是支持关系型数据库的,如果有人使用会考虑做的更通用,比如能支持文件,nosql之类的,等有时间在更新
具体请参考git上源码pydbclib
喜欢的记得点star,不然也不知道有没人用,不足的地方请指正
新人第一次写技术博客,描述有点乱还请见谅