官方网站: 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'