主要對於粗略看了一下文檔,但是又不是特別清楚的人提供一些信息。
簡單認識
創建連接對象
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
mysql_conf = {
'host': '127.0.0.1',
'user': 'root',
'passwd': 'root',
'db': 'diyidan_link_service',
'port': '3306',
# mysql中的utf8不是真正的utf8,建議直接使用utf8mb4
'charset': 'utf8mb4',
}
engine = create_engine(
'mysql+pymysql://%(user)s:%(passwd)s@%(host)s:%(port)s/%(db)s?charset=%(charset)s' % mysql_conf,
echo=True, # 打印sql語句(正式服不要加)
max_overflow=0, # 超過連接池大小外最多創建的連接
pool_size=5, # 連接池大小
pool_timeout=30, # 池中沒有線程最多等待的時間,否則報錯
pool_recycle=-1 # 多久之後對線程池中的線程進行一次連接的回收(重置)
)
Session = sessionmaker(bind=engine)
# 大項目最好自己定義一個session工廠方法。
session = Session()
建表
import sqlalchemy
from sqlalchemy import Column
from sqlalchemy import String,TIMESTAMP,Text,BIGINT
from sqlalchemy.ext.declarative import declarative_base
# 相當於django orm中的Model類(可以利用declarative_base()定義公共字段)
BaseModel = declarative_base()
class TestModel(BaseModel):
__tablename__ = 'test'
__table_args__ = {'mysql_charset': 'utf8', 'mysql_engine': 'InnoDB'}
# 主鍵
test_id = Column(BIGINT(20, unsigned=True), primary_key=True)
title = Column(String(50), nullable=True)
content = Column(Text, nullable=True)
# 創建時自動添加
create_time = Column(TIMESTAMP, server_default=sqlalchemy.sql.expression.text('CURRENT_TIMESTAMP()'))
# 修改時自動更新
update_time = Column(TIMESTAMP, server_default=sqlalchemy.sql.expression.text('CURRENT_TIMESTAMP() on update CURRENT_TIMESTAMP()'))
生成表
BaseModel.metadata.create_all(engine)
增刪改查
############### 增
tx = TestModel(title="測試", content="測試insert")
session.add(tx)
session.commit()
tx1 = TestModel(title="測試1", content="測試insert")
tx2 = TestModel(title="測試2", content="測試insert")
tx3 = TestModel(title="測試3", content="測試insert")
session.add_all([tx1,tx2,tx3])
session.commit()
############### 查
tx_query_obj = session.query( # 相當於 select
TestModel # 查出所有字段
# TestModel.title # 查出指定字段
# TestModel.title.label('the_title') # 查出指定字段並重命名
).filter( # 相當於where 過濾器
a == b
).filter_by( # 相當於where 等值過濾器
a = b
)
# 此時 tx_query_obj 並未執行sql語句。只有在使用數據時纔會執行。這種惰性加載和django orm是類似的
tx_query_all = tx_query_obj.all() # 全部查詢結果 list
tx_query_first = tx_query_obj.first() # 第一條查詢結果 obj
tx_query_one = tx_query_obj.one() # 獲取目標結果 obj 不存在或多行報錯
tx_query_one_or_one = tx_query_obj.one_or_one() # 獲取目標結果 與one 類似,不存在返回None
tx_query_scalar = tx_query_obj.scalar() #調用one,成功則返回第一列
############### 改
tx3.title = "測試4"
session.commit()
############### 刪
session.delete(tx2)
session.commit()
有意思的操作
按時間分組
from sqlalchemy import func
# 按創建時間的天分組 同理 func.month func.year func.hour ...
query.group_by(func.day(TestModel.create_time))
注意點
filter 與 filter_by 的區別
filter 過濾器
只接受一個條件,key 必須是 模型的屬性對象 如 TestModel.title
多個條件可以使用多個filter,也可以使用一些內置函數連接多條件
接收條件可以爲 大於(>) ,小於(<), 等於(==),不等於(!=)等
邏輯運算支持 in_, is_, and_ or_ 等
如:query.filter(TestModel.title.in_([‘測試’, ‘測試1’, ‘測試2’]))
加~符號表示not,query.filter(TestModel.title.in_([‘測試’, ‘測試1’, ‘測試2’]))
filter_by 等值過濾器:query.filter(~TestModel.title.in_([‘測試’, ‘測試1’, ‘測試2’]))
只接收等值條件,可以接收 多個 key=value 形式等值參數。
key爲字段字符串即可,即可以使用 **kw 形式傳參。
用到一點就學一點然後更新一點。。。