zoukankan      html  css  js  c++  java
  • python records操作数据库

    records

    简单了解:

    records:SQL for Humans™ https://pypi.python.org/pypi/records/

    Records 是一个非常简单但功能强大的库,用于对大多数关系数据库进行原始SQL查询。

    只需编写SQL。没有钟声,没有哨声。使用可用的标准工具,这一常见任务可能会令人惊讶地困难。该库努力使此工作流程尽可能简单,同时提供一个优雅的界面来处理您的查询结果。

    数据库支持包括RedShift,Postgres,MySQL,SQLite,Oracle和MS-SQL(不包括驱动程序)。

    安装:pip install records

    使用:

    • 调用 records.Database(......) 连接数据库,返回 <Database open=True>数据库对象
    • <Database open=True> 对象执行 sql 语句,详细见下。

    1、连接数据库:

    import records
    
    # 连接数据库
    db = records.Database('mysql://root:xuyang@localhost:3306/ceshi?charset=utf8mb4', pool_recycle=3600)  # MySQL默认连接8小时后自动断连,加参数pool_recycle每一小时重连 A Database. Encapsulates a url and an SQLAlchemy engine with a pool of connections.
    print(db)  # <Database open=True> 对象
    
    # --------------------------
    print(db.get_table_names())  # Returns a list of table names for the connected database.
    
    print(db.get_connection)  # Get a connection to this Database. Connections are retrieved from a pool.
    

    2、删除表

    table_name = 'userinfo'  # 数据表的表名
    drop_table_sql = """drop table if exists {};""".format(table_name)
    db.query(drop_table_sql)
    

    3、创建表

    create_table_sql = """create table if not exists {} (
        name varchar(20),
        age int
    ) default charset=utf8;""".format(table_name)
    db.query(create_table_sql)
    

    4、插入数据

    • 插入单条
    # records 支持使用 :variable 定义变量,通过参数传入完成动态传值,在需要动态加载数据的时候非常有用:
    user = {"name": "user0", "age": 20}
    db.query('insert into userinfo(name, age) values(:name, :age)', **user)
    
    • 插入多条
    # records 提供的 bulk_query 方法能快捷的插入和更新多条数据:
    users = [
    	{"name":"user1", "age": 21},
    	{"name":"user2", "age": 22},
    	{"name":"user3", "age": 23}
    ]
    db.bulk_query('insert into userinfo(name, age) values(:name, :age)', users)
    

    5、查询数据

    rows = db.query('select * from userinfo;')  
    # print(rows)  # <RecordCollection size=0 pending=True>
    
    # print(rows.all())  # 默认是自己封装的 RecordCollection 对象:[<Record {"name": "user0", "age": 20}>, <Record {"name": "user1", "age": 21}>, <Record {"name": "user2", "age": 22}>, <Record {"name": "user3", "age": 23}>]
    
    # print(rows.all(as_dict=True))  # 可以通过 as_dict=True 参数转成  字典形式:[{'name': 'user0', 'age': 20}, {'name': 'user1', 'age': 21}, {'name': 'user2', 'age': 22}, {'name': 'user3', 'age': 23}]
    
    # print(rows.all(as_ordereddict=True))  # 通过 as_ordereddict=True 转成  排序字典形式:[OrderedDict([('name', 'user0'), ('age', 20)]), OrderedDict([('name', 'user1'), ('age', 21)]), OrderedDict([('name', 'user2'), ('age', 22)]), OrderedDict([('name', 'user3'), ('age', 23)])]
    
    # print(rows.first())  # <Record {"name": "user0", "age": 20}>
    # print(rows.first(as_dict=True))  # {'name': 'user0', 'age': 20}
    
    # print(rows.first(as_ordereddict=True))  # OrderedDict([('name', 'user0'), ('age', 20)])
    
    # # print(rows.one())  # 查询唯一的一个。我自己这里报错
    
    userinfo_dict = rows.as_dict()  # 转换成 字典
    print(userinfo_dict[0]['age'])  # 20
    
    # 可 遍历 rows
    for row in rows:
    	print(row.name)
    

    6、数据导出为 json

    print(rows.export('json'))
    
    json_rows = rows.export('yaml')
    print(json_rows)
    # ------------------------------
    with open('userinfo.json', 'w') as fp:
    	fp.write(rows.export('json'))
    

    输出如下:

    [{"name": "user0", "age": 20}, {"name": "user1", "age": 21}, {"name": "user2", "age": 22}, {"name": "user3", "age": 23}]
    
    - {age: 20, name: user0}
    - {age: 21, name: user1}
    - {age: 22, name: user2}
    - {age: 23, name: user3}
    

    7、数据导出到 Excel 文件

    with open('userinfo.xlsx', 'wb') as f:
    	f.write(rows.export('xlsx'))
    

    8、转为表格形式

    print(rows.dataset)
    

    输出如下:

    name |age
    -----|---
    user0|20 
    user1|21 
    user2|22 
    user3|23 
    

    参考:如何使用python records 库优雅的操作数据库

  • 相关阅读:
    Android 图片文字单位 px、dp、sp区别
    替换Fragment 报错 The specified child already has a parent. You must call removeView() on the child's parent first.
    Android 程序怎么打log
    Android 启动项 Activity
    Actiivity 生命周期
    Oracle 监听/数据库 启动/关闭
    【HDU-2049】不容易系列之(4)——考新郎
    Linux内存子系统——Locking Pages(内存锁定)
    command三国杀开发日记20200915
    command三国杀开发日记20200914
  • 原文地址:https://www.cnblogs.com/sirxy/p/12187817.html
Copyright © 2011-2022 走看看