• 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

  • 相关阅读:
    如何打造“万人同屏”高并发实时互动小程序
    当小程序遇见物联网IoT,几行代码搞定智能插座控制
    数据存储(1):从数据存储看人类文明-数据存储器发展历程
    JPEG/Exif/TIFF格式解读(1):JEPG图片压缩与存储原理分析
    从中国农民与美国农民比对漫谈工业革命与工程化—反思996
    扯扯Java中的锁
    强化学习 5 —— SARSA 和 Q-Learning算法代码实现
    强化学习 4 —— 时序差分法(TD)解决无模型预测与控制问题
    强化学习 3—— 使用蒙特卡洛采样法(MC)解决无模型预测与控制问题
    强化学习 2—— 用动态规划求解 MDP (Policy Iteration and Value Iteration)
  • 原文地址:https://www.cnblogs.com/liyatao/p/13027304.html
Copyright © 2020-2023  润新知