zoukankan      html  css  js  c++  java
  • Python Records库使用举例

    官方网站: https://github.com/kennethreitz/records

    连接数据库

    Records使用sqlalchemy的create_engine,DBAPI可以完全参照sqlalchemy文档

    """PostgreSQL"""
    # default
    db = records.Database('postgresql://scott:tiger@localhost/mydatabase')
    # psycopg2
    db = records.Database('postgresql+psycopg2://scott:tiger@localhost/mydatabase')
    # pg8000
    db = records.Database('postgresql+pg8000://scott:tiger@localhost/mydatabase')
    
    
    """MySQL"""
    # default
    db = records.Database('mysql://scott:tiger@localhost/foo')
    # mysqlclient (a maintained fork of MySQL-Python)
    db = records.Database('mysql+mysqldb://scott:tiger@localhost/foo')
    # PyMySQL
    db = records.Database('mysql+pymysql://scott:tiger@localhost/foo')
    
    """Oracle"""
    db = records.Database('oracle://scott:tiger@127.0.0.1:1521/sidname')
    db = records.Database('oracle+cx_oracle://scott:tiger@tnsname')
    
    """Microsoft SQL Server"""
    # pyodbc
    db = records.Database('mssql+pyodbc://scott:tiger@mydsn')
    # pymssql
    db = records.Database('mssql+pymssql://scott:tiger@hostname:port/dbname')
    
    """SQLite"""
    # for a relative file path
    db = records.Database('sqlite:///foo.db')
    # for a absolute file path 
    # UNIX/MAC
    db = records.Database('sqlite:////absolute/path/to/foo.db')
    # Windows
    db = records.Database('sqlite:///C:\path\to\foo.db')
    # Windows using raw string
    db = records.Database(r'sqlite:///C:path	ofoo.db')
    # for a memory database
    db = records.Database('sqlite://')

    查询

    Records可以方便的使用SQL语句来查询数据,通过调用query方法,得到返回的结果

    rows = db.query('SELECT * FROM users')

    对于查询语句来说,Records返回的是一个Record对象或Record对象的一个列表。我们可以调用Record对象内置方法,比如:

    as_dict() 作为一个字典返回。

    as_dict(ordered=True) 作为一个OrderedDict返回。

    我们还可以像操作字典一样去操作Record对象,比如使用keys()values()

    rows = db.query(query=sql, fetchall=True, **kwargs)
        for k in rows.as_dict():
            print(k.values())
    
    --------------------------------
    dict_values(['2222', '小张'])
    dict_values(['3333', '小李'])

    Records使用tablib来处理数据导出,tablib是一个纯Python编写的格式无关的表格数据处理库,使用tablib我们可以方便的将Records对象导出成下列格式:

    • Excel (Sets + Books)
    • JSON (Sets + Books)
    • YAML (Sets + Books)
    • Pandas DataFrames (Sets)
    • HTML (Sets)
    • CSV (Sets)

    在Records类中,内置了一个dataset属性,用来生成一个tablib的Dataset对象,也提供了一个export方法,可以将Dataset对象转化为我们所需要的格式

    with open('user.xls', 'wb') as f:
                f.write(rows.export('xls'))

    综合实例

    导出用户表记录到excel

    import records
    import os
    import sys
    import tablib
    
    BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
    sys.path.append(BASE_DIR)  # 加入环境变量
    from conf import records_db_set
    
    
    
    os.environ['NLS_LANG'] = 'SIMPLIFIED CHINESE_CHINA.UTF8'
    # 设置中文,防止报乱码错误
    db = records.Database(records_db_set.BDDB)
    params = {'userid':'1111'}
    sql = '''SELECT userid as "用户ID",username as "用户名称" FROM M_USER where userid > :userid '''
    xls_name='user.xls'
    
    
    
    def export_recods(db, xls_name, sql, **kwargs):
        """
        导出数据库记录保存为xls形式
        :param db: db对象
        :param xls_name: xls_name文件名
        :param sql: sql语句
        :param kwargs: where条件
        :return:
        """
        # headers为excel 表头
        # title 为sheet名称
        dataset = tablib.Dataset(headers=['用户ID', '用户名称'], title='用户表')
    
        rows = db.query(query=sql, fetchall=True, **kwargs)
        for k in rows.as_dict():
            print(k.values())
            dataset.append(k.values())
    
        with open(xls_name, 'wb') as f:
            f.write(dataset .export(format='xls',))
    
    export_recods(db,xls_name,sql,**params)

    结果

    常见错误:

    UnicodeDecodeError: 'utf-8' codec can't decode byte 0xd3 in position 0: invalid continuation byte
    
    解决:
    设置环境变量中文
    os.environ['NLS_LANG'] = 'SIMPLIFIED CHINESE_CHINA.UTF8'
  • 相关阅读:
    C# winform中读取HTML代码
    C#获取参数getParameter
    C# checkboxlist的使用
    win7任务栏只显示日期不显示年月日
    做事要仔细
    JSP显示不完全问题
    C# tabconctrol切换事件
    C#中combobox不可编辑与不可选择
    根据单选框改变的文本框
    JS判断form内所有表单是否为空
  • 原文地址:https://www.cnblogs.com/xiao-apple36/p/13968213.html
Copyright © 2011-2022 走看看