SQLAlchemy是Python編程語言下的一款ORM框架,該框架建立在數據庫API之上,使用關系對象映射進行數據庫操作,簡言之便是:將對象轉換成SQL,然后使用數據API執行SQL並獲取執行結果。

SQLAchemy下載
pip3 install sqlalchemy
SQLAchemy使用
SQLAlchemy本身無法操作數據庫,其必須以來pymsql等第三方插件,Dialect用於和數據API進行交流,根據配置文件的不同調用不同的數據庫API,從而實現對數據庫的操作,如:
MySQL-Python
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
1、用sqlalchemy建表
import sqlalchemy
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String
# 連接方式 mysql+pymysql 用戶名 root 密碼 123456 主機 localhost 庫 testdb encoding 字符集
engine = create_engine("mysql+pymysql://root:123456@localhost/testdb",encoding='utf-8', echo=True)
Base = declarative_base() # 生成orm基類
class User(Base):
__tablename__ = 'user' # 表名
id = Column(Integer, primary_key=True)
name = Column(String(32))
password = Column(String(64))
Base.metadata.create_all(engine) # 創建表結構

如果數據庫已經有了這個表了就不會創建了,也不會報錯。

添加數據
先導入sessionmaker
from sqlalchemy.orm import sessionmaker
Session_class = sessionmaker(bind=engine) # 創建與數據庫的會話session class ,注意,這里返回給session的是個class,不是實例 Session = Session_class() # 生成session實例 cursor user_obj1 = User(name="alex", password="alex3714") # 生成你要創建的數據對象
user_obj2 = User(name="jack", password="122") # 生成你要創建的數據對象 print(user_obj.name, user_obj.id) # 此時還沒創建對象呢,不信你打印一下id發現還是None Session.add(user_obj1) # 把要創建的數據對象添加到這個session里, 一會統一創建
Session.add(user_obj2) # 把要創建的數據對象添加到這個session里, 一會統一創建 print(user_obj.name, user_obj.id) # 此時也依然還沒創建 Session.commit() # 現此才統一提交,創建數據


數據查詢
Session_class = sessionmaker(bind=engine) # 創建與數據庫的會話session class ,注意,這里返回給session的是個class,不是實例 Session = Session_class() # 生成session實例 cursor data = Session.query(User).filter_by(name="alex").all() #filter_by 查出來的是一個列表 print(data)

data = Session.query(User).filter_by().all()
如果filter_by沒有設置條件就把表中的數據都查出來了。

雖然是4條數據,但是完全看不懂,轉換下數據顯示格式。
在User類中添加一個方法:
class User(Base):
__tablename__ = 'user' # 表名
id = Column(Integer, primary_key=True)
name = Column(String(32))
password = Column(String(64))
def __repr__(self): #添加的方法
return "<%s name:%s>" % (self.id,self.name)

first() 取數據的第一條 , 沒有last()方法
data = Session.query(User).filter_by().first()
filter_by和filter的小區別
某些條件下用filter_by:
data = Session.query(User).filter_by(id=2).all()
轉成filter就要寫成:
data = Session.query(User).filter(User.id==2).all()
還有就是filter_by不能直接寫 > <這種條件 要用filter。
data = Session.query(User).filter(User.id>2).all()
多個條件
data = Session.query(User).filter(User.id>2).filter(User.id<5).all()
修改數據
還是通過面向對象的方式修改。
data = Session.query(User).filter(User.id>2).filter(User.id<5).first() print(data) data.name = 'Jack Liu' data.password = 'Shit happens' Session.commit()
原數據的name 

回滾
原理和事務的回滾是一樣的。
my_user = Session.query(User).filter_by(id=1).first()
my_user.name = "Jack"
fake_user = User(name='Rain', password='12345')
Session.add(fake_user)
print(Session.query(User).filter(User.name.in_(['Jack', 'rain'])).all()) # 這時看session里有你剛添加和修改的數據
Session.rollback() # 此時你rollback一下
print('after rollback')
print(Session.query(User).filter(User.name.in_(['Jack', 'rain'])).all()) # 再查就發現剛才添加的數據沒有了。


統計和分組
統計 count()
Session.query(User).filter(User.name.in_(['Jack', 'rain'])).count()
分組
from sqlalchemy import func Session.query(func.count(User.name),User.name).group_by(User.name).all()

第二種建表方式 不常用 了解即可
1 from sqlalchemy import Table, MetaData, Column, Integer, String, ForeignKey 2 from sqlalchemy.orm import mapper 3 4 metadata = MetaData() 5 #表結構 通過Table創建表 6 user = Table('user', metadata, 7 Column('id', Integer, primary_key=True), 8 Column('name', String(50)), 9 Column('fullname', String(50)), 10 Column('password', String(12)) 11 ) 12 13 14 class User(object): #不繼承Base 自定義類 15 def __init__(self, name, fullname, password): 16 self.name = name 17 self.fullname = fullname 18 self.password = password 19 20 21 mapper(User, user) #把這個類和表結果關聯一下
