sqlalchemy的基礎使用,sqlalchemy調用外部創建的觸發器

http://blog.csdn.net/u013600225/article/details/53913550

這個鏈接舉了一個觸發器的例子,這個例子在SQLiteStudio上面是可以正常運行的(在Navicat下執行失敗),然後就想試驗一下python的sqlalchemy能不能正常執行外部創建的這些觸發器,然後就寫了下面這個例子:

# -*- coding: utf-8 -*-
# 前面的是幾個通用函數.
import sqlalchemy
from sqlalchemy.ext.declarative import declarative_base
BaseMeta = declarative_base()  # BaseMeta.metadata.tables.keys() 含有"收集到的"所有的表


def initialize_session(s):
    """initialize_session和terminate_session要配對使用"""
    if isinstance(s, sqlalchemy.orm.session.sessionmaker):
        session = s()
        needClose = True
    elif isinstance(s, sqlalchemy.orm.session.Session):
        session = s
        needClose = False
    else:
        raise ValueError("未知的s={}".format(type(s)))
    return session, needClose


def terminate_session(session, needClose):
    """initialize_session和terminate_session要配對使用"""
    if needClose:
        session.close()
    return None


def _upsert(s, allNode):
    """allNode需要是一個可迭代的類型,可以是list,tuple等"""
    session, needClose = initialize_session(s)
    try:
        for node in allNode:
            session.merge(node)
        session.commit()
    finally:
        terminate_session(session, needClose)
    return len(allNode)


class data_part1(BaseMeta):
    __tablename__ = "data_part1"
    exchange = sqlalchemy.Column(sqlalchemy.String(16), primary_key=True)
    code = sqlalchemy.Column(sqlalchemy.String(32), primary_key=True)
    name = sqlalchemy.Column(sqlalchemy.String(32))
    group_id = sqlalchemy.Column(sqlalchemy.String(32))


class data_part2(BaseMeta):
    __tablename__ = "data_part2"
    exchange = sqlalchemy.Column(sqlalchemy.String(16), primary_key=True)
    code = sqlalchemy.Column(sqlalchemy.String(32), primary_key=True)
    price_tick = sqlalchemy.Column(sqlalchemy.Float)


class data_all(BaseMeta):
    __tablename__ = "data_all"
    exchange = sqlalchemy.Column(sqlalchemy.String(16), primary_key=True)
    code = sqlalchemy.Column(sqlalchemy.String(32), primary_key=True)
    name = sqlalchemy.Column(sqlalchemy.String(32))
    group_id = sqlalchemy.Column(sqlalchemy.String(32))
    price_tick = sqlalchemy.Column(sqlalchemy.Float)


if __name__ == "__main__":
    # Python 3.5.2 |Anaconda 4.2.0 (64-bit)
    # sqlalchemy.__version__ is '1.0.13'
    # 先創建好各個表和各個觸發器,然後用sqlalchemy往表裏面插入數據,結果顯示,觸發器是可以正常運行的.
    print(sqlalchemy.__version__)
    sqlite3_file = r"sqlite:///./_test.sqlite3"
    engine = sqlalchemy.create_engine(sqlite3_file)
    #
    BaseMeta.metadata.create_all(engine)
    #
    SessionMaker = sqlalchemy.orm.sessionmaker(bind=engine)
    session = SessionMaker()
    #
    if True:
        dp1 = data_part1()
        dp1.exchange = "SSE"
        dp1.code = "600000"
        dp1.name = 'PFYH'
        dp1.group_id = 'ASHARE'
        _upsert(session, [dp1])
        dp1.name = 'PUFA'
        _upsert(session, [dp1])
    if True:
        dp2 = data_part2()
        dp2.exchange = 'SSE'
        dp2.code = '600000'
        dp2.price_tick = 0.01
        _upsert(session, [dp2])
    #
    session.close()
    print("DONE")
    exit(0)

完。

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