關於 sqlalchemy 快速入門

主要對於粗略看了一下文檔,但是又不是特別清楚的人提供一些信息。

簡單認識

創建連接對象
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()

你需要了解 filter 與 filter_by 的區別

有意思的操作

按時間分組
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 形式傳參。

用到一點就學一點然後更新一點。。。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章