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)

完。

更多相关文章

  1. 创建链表的小例子
  2. LNMP(Linux+Nginx+Mysql+PHP)环境下安装yaf框架并编写一个MVC例子
  3. 简单统计报表例子(存储过程)
  4. 使用触发器插入另一个表
  5. msql,触发器无事物回滚,插入之前满足条件再插入
  6. unity连接数据库MySQL简单例子
  7. webgote的例子(6)SQL注入(盲注)
  8. 大神求解,hibernate4.2.1的一个HelloWorld例子配置搞了两天
  9. mysql更新触发器先插入另一张表然后删除该条数据

随机推荐

  1. Android(安卓)面试题(5):谈谈 Handler 机制
  2. 数据存储和界面展示一
  3. Android 4.4 SD卡文件读写变化
  4. Android菜鸟笔记3-Activity切换
  5. 【Mark 】AndroidStudio_移动应用开发
  6. 转-Android UI学习 - Tab的学习和使用
  7. Android UI LinearLayout权限级别与Table
  8. android滚动条
  9. android调用系统功能
  10. View的xml的属性作用大剖析