1. SQLalchemy簡介css
SQLAlchemy是一個開源的SQL工具包,基本Python編程語言的MIT許可證而發佈的對象關係映射器。SQLAlchemy提供了「一個熟知的企業級全套持久性模式,
專爲高效率和高性能的數據庫訪問而設計「。SQLAlchemy的首次發佈2006年2月,並已迅速成爲最普遍使用的對象關係映射在Python社區的工具之一。
使用ORM等獨立SQLAlchemy的一個優點在於其容許開發人員首先考慮數據模型,並能決定稍後可視化數據的方式
2. SQLAlchempy的安裝
首先需安裝mysql
而後,下載SQLAlchemy-0.7.2,而後打開cmd,在安裝包文件目錄下,
運行python setup.py install,經過python下輸入import sqlalchemy,執行未報錯則表示安裝成功
SQLAlchemy是Python編程語言下的一款ORM框架,該框架創建在數據庫API之上,使用關係對象映射進行數據庫操做,簡言之即是:將對象轉換成SQL,而後使用數據API執行SQL並獲取執行結果。html
ORM方法論基於三個核心原則:python
簡單:以最基本的形式建模數據。mysql
傳達性:數據庫結構被任何人都能理解的語言文檔化。nginx
精確性:基於數據模型建立正確標準化了的結構。sql
Dialect用於和數據API進行交流,根據配置文件的不一樣調用不一樣的數據庫API,從而實現對數據庫的操做,如:數據庫
MySQL-Pythondjango
mysql+mysqldb://<user>:<password>@<host>[:<port>]/<dbname>
pymysql編程
mysql+pymysql://<username>:<password>@<host>/<dbname>[?<options>]
MySQL-Connector服務器
mysql+mysqlconnector://<user>:<password>@<host>[:<port>]/<dbname>
cx_Oracle
oracle+cx_oracle://user:pass@host:port/dbname[?key=value&key=value...]
更多詳見:http://docs.sqlalchemy.org/en/latest/dialects/index.html
注:
2.7版本使用mysqldb 3.5版本使用pymysql 請用pip或者源碼包安裝,確保環境能夠正常使用。** 確保遠程數據庫服務器能夠正常使用,而且擁有全新能夠遠程登陸, 例如: 登陸數據庫:mysql -uroot -p 建立數據庫:create database s15; 受權庫:grant all on liuyao.* to john@"%" identified by '123456'; 更新:flush privileges;
3. SQLAlchemy的使用實例
1、完成簡單數據表信息查詢
# 1. 導入模塊
from sqlalchemy import *
from sqlclchemy.orm import *
# 2. 創建數據庫引擎
連接數據庫:create_engine()
engine = create_engine("mysql+mysqldb://john:123456@127.0.0.1:3306/s15", max_overflow=5) create_engine() 會返回一個數據庫引擎, mysql+mysqldb」指定了使用 MySQL-Python 來鏈接, 使用用戶名‘john
’和密碼‘123456’來連接數據庫 127.0.0.1
是數據庫連接地址能夠是localhost,127.0.0.1 ‘s15’是數據庫名 max_overflow是最大鏈接數 其餘方法: 「charset」指定了鏈接時使用的字符集(可省略)=utf8 echo 參數爲 True 時,會顯示每條執行的 SQL 語句,生產環境下可關閉。john127.0.0.1
mysql_engine = create_engine("$address", echo, module)
#address 數據庫://用戶名:密碼(沒有密碼則爲空)@主機名:端口/數據庫名
#echo標識用於設置經過python標準日誌模塊完成的SQLAlchemy日誌系統,當開啓日誌功能,咱們將能看到全部的SQL生成代碼
create_engine的第一個參數'sqlite:///:memory:'咱們知道是創建數據庫鏈接的,那第二個參數echo=True是作什麼的呢,其實若是echo=True那麼SQLAlchemy將會經過Python標準模塊logging來輸出日誌,
若是你在操做交互式命令控制檯,一些信息將會被輸出,這裏咱們可能會看到SQLAlchemy生成的一些SQL語句,這個對於咱們學習和調試是頗有必要的,因此在這裏咱們將其設置爲True,不然,
若是不肯意SQLAlchemy這麼囉嗦的話能夠設置爲False,這樣就看不到這些信息啦。
create_engine()將會返回一個Engine引擎實例(instance),其表明着SQLAlchemy對於數據庫的核心接口,其隱藏了各類數據庫方言(dialect)的細節,實際上SQLAlchemy的底層是Python的DBAPI。
須要注意的是此時並無實質上與數據庫創建鏈接,何時纔會與數據庫真正創建鏈接呢?這個只會在你第一次查詢數據庫的時候發生。呃…這個有點像Lazy Loading (懶惰加載,延遲加載),也就是說咱們須要真正操做數據庫的時候才真正創建鏈接。
段和數據類型及操做方法
在sqlalchemy.schema包裏有數據庫關係的描述,列舉幾個最經常使用的:
字段:Column
索引:Index
表:Table
數據類型在sqlalchemy.types包,列舉幾個最經常使用的:
二進制:BIGINT
布爾:BOOLEAN
字符:CHAR
可變字符:VARCHAR
日期:DATETIME
其餘方法 execute,update,insert,select,delete,join等 自行補腦
# 3. 創建鏈接
connection = mysql_engine.connect()
# 4. 查詢表信息
result = connection.execute("select name from t_name)
for row in result:
print "name: ", row['name']
# 5. 關閉鏈接
connection.close()
2、插入新的數據表
# 1. 導入模塊
from sqlalchemy import *
from sqlclchemy.orm import *
# 2. 創建數據庫引擎
mysql_engine = create_engine("$address", echo, module)
#address 數據庫://用戶名:密碼(沒有密碼則爲空)@主機名:端口/數據庫名
#echo標識用於設置經過python標準日誌模塊完成的SQLAlchemy日誌系統,當開啓日誌功能,咱們將能看到全部的SQL生成代碼
# 3. 設置metadata並將其綁定到數據庫引擎
metadata = Metadata(mysql_engine)
# 4. 定義需新建的表
users = Table('users', metadata,Column('user_id', Integer, primary_key=True),
Column('name', String(40)),
Column('age', Integer),
Column('password', String),)
#Table實現方式與SQL語言中的CRETE TABLE相似
# 5. 在數據庫中建立表
metadata.create_all(mysql_engine)
#向數據庫發出CREATE TABLE命令,由此數據庫新建名爲users的表
#調用時會檢查已經存在的表結構,所以可重複調用
# 6. 建立一個與數據庫中的users表匹配的python類
class user():
def __int__(self, name, fullname, password):
self.name = name
self.fullname = fullname
self.passwd = passwd
#python類的屬性需與users表的列名一致
# 7. 設置映射
from sqlalchemy.orm import mapper
mapper(user, users)
# mapper()建立一個新的Mapper對象,與定義的類相關聯 #須要注意的是,經過mapper創建映射的數據表必須帶有主鍵,若是沒有主鍵就沒法定位某個table的某行row, #若是沒法定位某行row, 就沒法作Object-relational mapping這樣的映射
# 8. 建立session
Session = sessionmaker(bind=mysql_egnine)
session = Session()
#由此咱們只需對python的user類的操做,後臺數據庫的具體實現交由session完成
# 9. 執行
session.commit()
#實現與數據庫的交互
# 10. 查詢
usr_info = session.query(user).filter_by(age=12).first()
# 數據庫表是一個二維表, 包含多行多列. 把一個表的內容用pyton的數據接口表示的話, 能夠用list表示多行 # list的每個元素是tuple, 表示一個記錄.好比id 和name的user表 # [ # ('1', 'Michael'), # ('2', 'Bob'), # ('3', 'Adam') # ] # Python的DB-API返回的數據接口就是像上面這樣. # 可是用tuple表示一行很難看出表的結構.若是把一個tuple用class實例表示, 就能夠更容易看出表的結構 # class User(object): # def __init__(self, id, name): # self.id = id # self.name = name # 這就是傳說中的ORM技術: Object-Relational Mapping, 把關係數據庫的表結構映射到對象上. # 可是由誰來作這個轉換呢, 因此ORM框架應運而生. # 在Python中, 最有名的ORM框架是SQLAlchemy. 咱們來看看SQLAlchemy的用法. from sqlalchemy import Column, String, create_engine from sqlalchemy.orm import sessionmaker from sqlalchemy.ext.declarative import declarative_base Base = declarative_base() class User(Base): # 表的名字 __tablename__ = 'user' # 表的結構 id = Column(String(20), primary_key=True) name = Column(String(20)) # 初始化數據庫鏈接 engine = create_engine('mysql+mysqlconnector://root:111111@localhost:3306/test') # 建立DBSession類型 DBSession = sessionmaker(bind=engine) # create_engine用來初始化數據庫鏈接. # SQLAlchemy用一個字符串表示鏈接信息'數據庫類型+數據庫驅動名稱://用戶名:口令@機器地址:端口號/數據庫名' # # 建立session對象: # session = DBSession() # # 建立新User對象 # new_user = User(id='5', name='Bob') # # 添加到session # session.add(new_user) # # 提交保存到數據庫 # session.commit() # # 關閉session # session.close() # 可見將關鍵是獲取session, 而後把對象添加到session, 最後提交併關閉.(DBSession對象, 能夠看作是當前數據庫的鏈接) # 查詢 session = DBSession() # 建立Query查詢, filter是where條件, 最後調用one()返回惟一行, 若是調用all()則返回全部行. user = session.query(User).filter(User.id=='5').one() print('type:', type(user)) print('name:', user.name) session.close() # ORM就是把數據庫表的行與相應的對象簡歷關聯, 互相轉換. # 因爲關係數據庫的多個表還能夠用外鍵實現一對多, 多對多的關聯, 相應地, ORM框架也能夠提供兩個對象之間的一對多, 多對多功能.
ORM框架的做用就是把數據庫表的一行記錄與一個對象互相作自動轉換。
正確使用ORM的前提是瞭解關係數據庫的原理。