python通用数据库操作工具 pydbclib的使用简介
作者:taogeYT 发布时间:2024-01-24 14:24:16
标签:python,数据库,操作工具,pydbclib
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.cnblogs.com/liyatao/p/13027304.html


猜你喜欢
- 任务说明:编写一个钱币定位系统,其不仅能够检测出输入图像中各个钱币的边缘,同时,还能给出各个钱币的圆心坐标与半径。效果代码实现Canny边缘
- 获取当前工作目录import sysprint(sys.path[0])获取执行命令的位置import osprint(os.getcwd(
- TMD这年头做前端真命苦,IE出了N个版本就算了,还跳出个马桶出来。你说你这个马桶,用人家内核就好好用拉。还改人家的东西干啥,那你改就改拉,
- NOMONEYDAY123114321-45324212-102250331008为了符合阅读习惯,最终报表希望是如下格式:NOMONTUE
- 本文实例讲述了Python字符串拼接、截取及替换方法。分享给大家供大家参考,具体如下:python字符串连接python字符串连接有几种方法
- 本文实例讲述了gearman+mysql方式实现持久化操作。分享给大家供大家参考,具体如下:1、为什么要持久化?gearman的job se
- 首先给大家分享一篇js中int和string数据类型互相转化实例https://www.aspxhome.com/article/15474
- 需要实现的组件效果:该组件有设置颜色、大小、旋转度数和文本内容功能。一、组件实现代码组件代码文件结构src/components/Stamp
- 1、||(逻辑或),从字面上来说,只有前后都是false的时候才返回false,否则返回true。alert(true||false); /
- 一、乱码的原因:1、 client客户端的编码不是utf82、server端的编码不是utf83、database数据库的编码不是utf84
- 很多人认为python中的字典是无序的,因为它是按照hash来存储的,但是python中有个模块collections(英文,收集、集合),
- 简介工作中偶尔会出现一个查询数据的需求,那就是需要按天统计近一个月或其它一段时间内每天的所有记录或者分组数据,没有数据则自动补0。一般情况下
- 本文是对pandas官方网站上《10Minutes to pandas》的一个简单的翻译,原文在这里。这篇文章是对pandas的一个简单的介
- 问题:变量名是否合法: 1.变量名可以由字母
- 一维插值插值不同于拟合。插值函数经过样本点,拟合函数一般基于最小二乘法尽量靠近所有样本点穿过。常见插值方法有拉格朗日插值法、分段插值法、样条
- 两个进程发生死锁的典型例子是:进程T1中获取锁A,申请锁B;进程T2中获取锁B,申请锁A,我们下面动手来演示一下这种情况:1. 创建一个Da
- 前言上篇文章相信大家已经了解了pytest在cmd下结合各种命令行参数如何运行测试用例,并输出我们想要看到的信息。那么今天会讲解一下pyte
- beego中各类数据库连接方式beego 框架是优秀得go REST API开发框架。下面针对beego中各类数据库连接操作做一个总结。or
- TensorFlow-gpu1.安装Anaconda进入官网(https://www.anaconda.com/) ->get sta
- 滚动图片可以说是做网站经常会遇到的,特别是做企业网站,最常用的像产品展示,图片展示等,滚动的好处是吸引眼球,让人一下就注意到。之前本站发了一