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\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 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'

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM