python-SQLAlchemy之Engine、Connection、Session

execute()的三種方式
from sqlalchemy.orm import sessionmaker
from sqlalchemy import create_engine, Table, MetaData, Column, Integer, String

def sqlalchemy_test():
    engine = create_engine("mysql+pymysql://username:password@localhost:3306/database_name?charset=utf8", echo=True)  
    meta = MetaData()
    test_table = Table("tb_test", meta,
                   Column("id", Integer, primary_key=True, autoincrement=True),
                   Column("name", String(255))
                   )
    # 方式1
    res_1 = engine.execute(test_table.select())
    for re in res_1:
        # dosomething
    res_1.close()

    # 方式2
    conn = engine.connect()
    res_2 = conn.execute(test_table.select())
    for re in res_2:
        # dosomething
    res_2.close()

    # 方式3
    session_db = sessionmaker(bind=engine)
    session = session_db()
    res_3 = session.execute(test_table.select())
    for re in res_3:
        # dosomething
    session.close()

這里需要說明一下,指定數(shù)據(jù)庫編碼的時候,經(jīng)測試engine自帶的設(shè)置編碼格式的參數(shù)encoding沒有效果(不知道是不是只有mysql+pymysql有這樣的情況),所以使用?charset=utf8的形式指定數(shù)據(jù)庫編碼
三種方式的區(qū)別
感覺engine.execute()和connection.execute()沒有太大的區(qū)別,engine.execute()會轉(zhuǎn)化成connection.execute()。

Engine object (instantiated via create_engine())
->
Connection object (instantiated via engine_instance.connect())
->
connection.execute({*SQL expression*})

session.execute()最終也是使用connection.execute(),而且使用session對象與數(shù)據(jù)庫交互是orm推薦的方式。感覺session是有事物的概念的,session.add(), session.commit(), session.close(),session.rollback()。既然官方推薦這種方式,以后還是盡量使用session來與數(shù)據(jù)庫交互吧。

另外,使用try,except捕獲異常,有回滾操作的時候,建議使用以下方式:

class ThingOne(object):
    def go(self, session):
        session.query(FooBar).update({"x": 5})

class ThingTwo(object):
    def go(self, session):
        session.query(Widget).update({"q": 18})

def run_my_program():
    session = Session()
    try:
        ThingOne().go(session)
        ThingTwo().go(session)

        session.commit()
    except:
        session.rollback()
        raise
    finally:
        session.close()

原文鏈接:https://blog.csdn.net/qq_25730711/article/details/53407459

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容