python records库_Python 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:[email protected]: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\to\foo.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 inrows.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

importrecordsimportosimportsysimporttablib

BASE_DIR= os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

sys.path.append(BASE_DIR)#加入环境变量

from conf importrecords_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 inrows.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'

你可能感兴趣的:(python,records库)