python量化开发2|python与各数据库的接口调通

今天是2017.1.9r。

看到了之前已经开发的一些API,但是由于之前没有系统的学习python中类的编写,所以看起来还是有一些吃力的,甚至有一点点泄气。不过不知道从什么时候开始,自己每次遇到困难时总会在内心告诉自己,因为现在是在走上坡路才会感到吃力,说明你正在往上走,在进步。

这里会记录一些在看相关API中遇到的一些不懂的python中相应库和语法。


一、关于使用pip命令安装库

之前在terminal中用pip install时一直报错找不到相应版本的库。
所以只好下载对应库的.whl文件,然后再用pip install 命令安装这个.whl文件。
(这里是自己找到的一个包括所有第三方库whl文件的下载地址:http://www.lfd.uci.edu/~gohlke/pythonlibs/#pymssql

二、python和各个数据库之间的接口调通

做这一类的开发必然会用到数据库中的数据,这就需要用python连接各类数据库,包括SQL Sever、Mysql、Oracle、MongoDB等。在python中使用sqlalchemy 库中的create_engine来建立连接。

from sqlalchemy import create_engine
from pymongo import MongoClient
db_engine=dict()        #---用db_engine这个空字典来存储所有的连接
db_engine['MongoDB']=MongoClient('192.168.169.39', 40000)

db_engine['Tinysoft']=create_engine('mssql+pymssql://fes:fes@10.132.120.141:1433/TsFund', echo=False)

db_engine['PPW']=create_engine('mysql+pymysql://data_user_hr:0!sH,nSDC#m4oTha@211.154.153.26:3306/rz_hfdb_core?charset=utf8mb4',  echo=False)

db_engine['TOS_RES']=create_engine('oracle://res:1@10.53.54.12:1521/orcl', echo=False)

三、sqlalchemy库 的使用

下面再说一些使用sqlalchemy库对数据库进行操作的例子。

from sqlalchemy import * # Column, String, create_engine,func, or_, not_
from sqlalchemy.orm import * # sessionmaker
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.types import CHAR, Integer
from odo import odo

(1)、底层处理
使用 Engine/ConnectionPooling/Dialect 进行数据库操作,Engine使用ConnectionPooling连接数据库,然后再通过Dialect执行SQL语句。

#创建引擎
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker

DB_CONNECT_STRING = 'mysql+mysqldb://root:123@localhost/ooxx?charset=utf8'
engine = create_engine(DB_CONNECT_STRING, echo=True)
DB_Session = sessionmaker(bind=engine)
session = DB_Session()

这里的 DB_CONNECT_STRING 就是连接数据库的路径。“mysql+mysqldb”指定了使用 MySQL-Python 来连接,“root”和“123”分别是用户名和密码,“localhost”是数据库的域名,“ooxx”是使用的数据库名(可省略),“charset”指定了连接时使用的字符集(可省略)。
create_engine() 会返回一个数据库引擎,echo 参数为 True 时,会显示每条执行的 SQL 语句,生产环境下可关闭。
sessionmaker() 会生成一个数据库会话类。
拿到 session 后,就可以执行 SQL 了:
session.execute('create database abc')

(2)、ORM功能使用
使用 ORM/Schema Type/SQL Expression Language/Engine/ConnectionPooling/Dialect 所有组件对数据进行操作。根据类创建对象,对象转换成SQL,执行SQL。

from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String, ForeignKey, UniqueConstraint, Index
from sqlalchemy.orm import sessionmaker, relationship
from sqlalchemy import create_engine

engine = create_engine("mysql+pymysql://fuzj:123123@127.0.0.1:3306/123", max_overflow=5)

Base = declarative_base()         ---------------------------- declarative_base()用来表示 

class Favor(Base):
__tablename__ = 'favor'
nid = Column(Integer, primary_key=True)
caption = Column(String(50), default='red', unique=True)

class Person(Base):
__tablename__ = 'person'
nid = Column(Integer, primary_key=True)
name = Column(String(32), index=True, nullable=True)
favor_id = Column(Integer, ForeignKey("favor.nid"))

Base.metadata.create_all(engine)  #创建表    
# Base.metadata.drop_all(engine)   #删除表

declarative_base() 创建了一个 BaseModel 类,这个类的子类可以自动与一个表关联。
以 User 类为例,它的 tablename 属性就是数据库中该表的名称,它有 id 和 name 这两个字段,分别为整型和 30 个定长字符。Column 还有一些其他的参数,我就不解释了。
最后,BaseModel.metadata.create_all(engine) 会找到 BaseModel 的所有子类,并在数据库中建立这些表;drop_all() 则是删除这些表。

(3)、Odo:实现不同格式数据的转换
Odo 库是Blaze的一个衍生项目. 用于数据交换,保证了各种不同格式数据间的移植 (CSV, JSON, HDFS, and more) 并且跨越不同的数据库 (SQL 数据库, MongoDB, 等等) ,用法简单,Odo(source, target)

odo需要传递两个参数,第一个参数是数据来源,第二个参数是目标数据格式。
>>> from odo import odo
>>> odo((1, 2, 3), list)
[1, 2, 3]

推荐阅读更多精彩内容