python通用数据库操作工具 pydbclib的使用简介


Posted in Python onDecember 21, 2020

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

以上就是python通用数据库操作工具 pydbclib的使用简介的详细内容,更多关于python 数据库操作工具pydbclib的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
python抓取网页图片示例(python爬虫)
Apr 27 Python
Python中字典(dict)和列表(list)的排序方法实例
Jun 16 Python
Python数据类型详解(三)元祖:tuple
May 08 Python
Python实现PS图像调整颜色梯度效果示例
Jan 25 Python
JavaScript中的模拟事件和自定义事件实例分析
Jul 27 Python
使用Python写一个量化股票提醒系统
Aug 22 Python
python3应用windows api对后台程序窗口及桌面截图并保存的方法
Aug 27 Python
基于Python实现船舶的MMSI的获取(推荐)
Oct 21 Python
Python完全识别验证码自动登录实例详解
Nov 24 Python
使用tqdm显示Python代码执行进度功能
Dec 08 Python
Python实现队列的方法示例小结【数组,链表】
Feb 22 Python
Python3如何使用range函数替代xrange函数
Oct 05 Python
Python 多进程原理及实现
Dec 21 #Python
python-图片流传输的思路及示例(url转换二维码)
Dec 21 #Python
python 用pandas实现数据透视表功能
Dec 21 #Python
python 生成正态分布数据,并绘图和解析
Dec 21 #Python
python statsmodel的使用
Dec 21 #Python
Python 实现集合Set的示例
Dec 21 #Python
Python 实现二叉查找树的示例代码
Dec 21 #Python
You might like
php检测网页是否被百度收录的函数代码
2013/10/09 PHP
ThinkPHP中自定义错误页面和提示页面实例
2014/11/22 PHP
php通过asort()给关联数组按照值排序的方法
2015/03/18 PHP
YII分模块加载路由的实现方法
2018/10/01 PHP
php更新cookie内容的详细方法
2019/09/30 PHP
childNodes.length与children.length的区别
2009/05/14 Javascript
Javascript在IE或Firefox下获取鼠标位置的代码
2009/12/18 Javascript
jquery 中多条件选择器,相对选择器,层次选择器的区别
2012/07/03 Javascript
ajax异步刷新实现更新数据库
2012/12/03 Javascript
javascript常用的正则表达式实例
2014/05/15 Javascript
js选项卡的实现方法
2015/02/09 Javascript
jQuery实现鼠标经过提示信息的地图热点效果
2015/04/26 Javascript
JavaScript编写推箱子游戏
2015/07/07 Javascript
jQuery给元素添加样式的方法详解
2015/12/30 Javascript
原生JS实现首页进度加载动画
2016/09/14 Javascript
基于Vue和Element-Ui搭建项目的方法
2019/09/06 Javascript
vue实现匀速轮播效果
2020/06/29 Javascript
[01:45]IMBATV TI4前线报道-选手到达
2014/07/07 DOTA
Python返回真假值(True or False)小技巧
2015/04/10 Python
在Python中操作列表之List.append()方法的使用
2015/05/20 Python
分析Python中设计模式之Decorator装饰器模式的要点
2016/03/02 Python
Pytorch入门之mnist分类实例
2018/04/14 Python
Python3.5多进程原理与用法实例分析
2019/04/05 Python
pytorch数据预处理错误的解决
2020/02/20 Python
详解python UDP 编程
2020/08/24 Python
python爬虫基础之urllib的使用
2020/12/31 Python
深入解析HTML5的IndexedDB索引数据库
2015/09/14 HTML / CSS
天猫超市:阿里巴巴打造的网上超市
2016/11/02 全球购物
eBay加拿大站:eBay.ca
2019/06/20 全球购物
生产班组长岗位职责
2014/01/05 职场文书
社区文艺活动方案
2014/08/19 职场文书
2014年社区综治工作总结
2014/11/17 职场文书
不同意离婚代理词
2015/05/23 职场文书
债务追讨律师函
2015/06/24 职场文书
2015年中秋节主持词
2015/07/30 职场文书
Python超详细分步解析随机漫步
2022/03/17 Python