今天是2017.1.9r新症。
看到了之前已經(jīng)開發(fā)的一些API,但是由于之前沒有系統(tǒng)的學(xué)習(xí)python中類的編寫虐块,所以看起來還是有一些吃力的赋除,甚至有一點(diǎn)點(diǎn)泄氣。不過不知道從什么時(shí)候開始非凌,自己每次遇到困難時(shí)總會在內(nèi)心告訴自己举农,因?yàn)楝F(xiàn)在是在走上坡路才會感到吃力,說明你正在往上走敞嗡,在進(jìn)步颁糟。
這里會記錄一些在看相關(guān)API中遇到的一些不懂的python中相應(yīng)庫和語法。
一喉悴、關(guān)于使用pip命令安裝庫
之前在terminal中用pip install時(shí)一直報(bào)錯(cuò)找不到相應(yīng)版本的庫棱貌。
所以只好下載對應(yīng)庫的.whl文件,然后再用pip install 命令安裝這個(gè).whl文件箕肃。
(這里是自己找到的一個(gè)包括所有第三方庫whl文件的下載地址:http://www.lfd.uci.edu/~gohlke/pythonlibs/#pymssql )
二婚脱、python和各個(gè)數(shù)據(jù)庫之間的接口調(diào)通
做這一類的開發(fā)必然會用到數(shù)據(jù)庫中的數(shù)據(jù),這就需要用python連接各類數(shù)據(jù)庫勺像,包括SQL Sever障贸、Mysql、Oracle吟宦、MongoDB等篮洁。在python中使用sqlalchemy 庫中的create_engine來建立連接。
from sqlalchemy import create_engine
from pymongo import MongoClient
db_engine=dict() #---用db_engine這個(gè)空字典來存儲所有的連接
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庫對數(shù)據(jù)庫進(jìn)行操作的例子袁波。
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 進(jìn)行數(shù)據(jù)庫操作,Engine使用ConnectionPooling連接數(shù)據(jù)庫篷牌,然后再通過Dialect執(zhí)行SQL語句睡蟋。
#創(chuàng)建引擎
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 就是連接數(shù)據(jù)庫的路徑〖霞眨“mysql+mysqldb”指定了使用 MySQL-Python 來連接戳杀,“root”和“123”分別是用戶名和密碼,“l(fā)ocalhost”是數(shù)據(jù)庫的域名偷卧,“ooxx”是使用的數(shù)據(jù)庫名(可省略),“charset”指定了連接時(shí)使用的字符集(可省略)吆倦。
create_engine() 會返回一個(gè)數(shù)據(jù)庫引擎听诸,echo 參數(shù)為 True 時(shí),會顯示每條執(zhí)行的 SQL 語句蚕泽,生產(chǎn)環(huán)境下可關(guān)閉晌梨。
sessionmaker() 會生成一個(gè)數(shù)據(jù)庫會話類。
拿到 session 后须妻,就可以執(zhí)行 SQL 了:
session.execute('create database abc')
(2)仔蝌、ORM功能使用
使用 ORM/Schema Type/SQL Expression Language/Engine/ConnectionPooling/Dialect 所有組件對數(shù)據(jù)進(jìn)行操作。根據(jù)類創(chuàng)建對象荒吏,對象轉(zhuǎn)換成SQL敛惊,執(zhí)行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) #創(chuàng)建表
# Base.metadata.drop_all(engine) #刪除表
declarative_base() 創(chuàng)建了一個(gè) BaseModel 類绰更,這個(gè)類的子類可以自動與一個(gè)表關(guān)聯(lián)瞧挤。
以 User 類為例,它的 tablename 屬性就是數(shù)據(jù)庫中該表的名稱儡湾,它有 id 和 name 這兩個(gè)字段特恬,分別為整型和 30 個(gè)定長字符。Column 還有一些其他的參數(shù)徐钠,我就不解釋了癌刽。
最后,BaseModel.metadata.create_all(engine) 會找到 BaseModel 的所有子類尝丐,并在數(shù)據(jù)庫中建立這些表显拜;drop_all() 則是刪除這些表。
(3)爹袁、Odo:實(shí)現(xiàn)不同格式數(shù)據(jù)的轉(zhuǎn)換
Odo 庫是Blaze的一個(gè)衍生項(xiàng)目. 用于數(shù)據(jù)交換讼油,保證了各種不同格式數(shù)據(jù)間的移植 (CSV, JSON, HDFS, and more) 并且跨越不同的數(shù)據(jù)庫 (SQL 數(shù)據(jù)庫, MongoDB, 等等) ,用法簡單呢簸,Odo(source, target)
odo需要傳遞兩個(gè)參數(shù)矮台,第一個(gè)參數(shù)是數(shù)據(jù)來源乏屯,第二個(gè)參數(shù)是目標(biāo)數(shù)據(jù)格式。
>>> from odo import odo
>>> odo((1, 2, 3), list)
[1, 2, 3]