Python SQLAlchemy initialize_db.py-初始数据填充语法有问题

Python SQLAlchemy initialize_db.py-初始数据填充语法有问题,python,sqlalchemy,pyramid,Python,Sqlalchemy,Pyramid,我有以下表格: Schema | Name | Type | Owner --------+----------------+-------+--------- public | fds_funds | table | finance public | fdt_fund_types | table | finance public | usf_user_funds | table | finance public | usr_users |

我有以下表格:

 Schema |      Name      | Type  |  Owner
--------+----------------+-------+---------
 public | fds_funds      | table | finance
 public | fdt_fund_types | table | finance
 public | usf_user_funds | table | finance
 public | usr_users      | table | finance
我正在尝试初始化几个数据库中的一些数据。基本上,我尝试添加一个“现金”基金类型,然后使用该基金类型添加一个基金。当然,问题是我不知道基金类型的ID,直到它在数据库中,我不想硬编码它

因此,我的initializedb.py当前如下所示:

def main(argv=sys.argv):
    if len(argv) < 2:
        usage(argv)
    config_uri = argv[1]
    options = parse_vars(argv[2:])
    setup_logging(config_uri)
    settings = get_appsettings(config_uri, options=options)
    engine = engine_from_config(settings, 'sqlalchemy.')
    DBSession.configure(bind=engine)
    Base.metadata.create_all(engine)
    with transaction.manager:
        fund_type = FundType(fdt_type_name='cash')
        DBSession.add(fund_type)
        transaction.commit()

    with transaction.manager:
        fund = Fund(fds_name='Vanguard Prime Money Market Fund', fds_symbol='vmmxx', fds_fdt_fund_type_id=fund_type.fdt_fund_type_id)
        DBSession.add(fund)
        transaction.commit()
def main(argv=sys.argv): 如果len(argv)<2: 用法(argv) config_uri=argv[1] options=parse_vars(argv[2:]) 设置日志(配置uri) 设置=获取应用设置(配置uri,选项=选项) engine=engine\u从配置(设置“sqlalchemy.”) DBSession.configure(绑定=引擎) Base.metadata.create_all(引擎) 使用transaction.manager: 基金类型=基金类型(fdt类型名称=现金) DBSession.add(基金类型) commit()事务 使用transaction.manager: 基金=基金(fds_name='Vanguard Prime Money Market fund',fds_symbol='vmmxx',fds_fdt_fund_type_id=基金类型.fdt_fund_type_id) DBSession.add(基金) commit()事务 因此,当我运行初始化脚本时,我得到以下输出:

2014-07-29 19:05:09,011 INFO  [sqlalchemy.engine.base.Engine][MainThread] {}
2014-07-29 19:05:09,014 INFO  [sqlalchemy.engine.base.Engine][MainThread] COMMIT
2014-07-29 19:05:09,022 INFO  [sqlalchemy.engine.base.Engine][MainThread] BEGIN (implicit)
2014-07-29 19:05:09,024 INFO  [sqlalchemy.engine.base.Engine][MainThread] INSERT INTO fdt_fund_types (fdt_type_name, fdt_usr_user_id) VALUES (%(fdt_type_name)s, %(fdt_usr_user_id)s) RETURNING fdt_fund_types.fdt_fund_type_id
2014-07-29 19:05:09,024 INFO  [sqlalchemy.engine.base.Engine][MainThread] {'fdt_type_name': 'cash', 'fdt_usr_user_id': None}
2014-07-29 19:05:09,025 INFO  [sqlalchemy.engine.base.Engine][MainThread] COMMIT
Traceback (most recent call last):
  File "/var/www/finance/finance-env/bin/initialize_corefinance_db", line 9, in <module>
    load_entry_point('corefinance==0.0', 'console_scripts', 'initialize_corefinance_db')()
  File "/var/www/finance/corefinance/corefinance/scripts/initializedb.py", line 45, in main
    fund = Fund(fds_name='Vanguard Prime Money Market Fund', fds_symbol='vmmxx', fds_fdt_fund_type_id=fund_type.fdt_fund_type_id)
  File "/var/www/finance/finance-env/lib/python3.2/site-packages/SQLAlchemy-0.9.5-py3.2-linux-x86_64.egg/sqlalchemy/orm/attributes.py", line 233, in __get__
    return self.impl.get(instance_state(instance), dict_)
  File "/var/www/finance/finance-env/lib/python3.2/site-packages/SQLAlchemy-0.9.5-py3.2-linux-x86_64.egg/sqlalchemy/orm/attributes.py", line 577, in get
    value = callable_(state, passive)
  File "/var/www/finance/finance-env/lib/python3.2/site-packages/SQLAlchemy-0.9.5-py3.2-linux-x86_64.egg/sqlalchemy/orm/state.py", line 422, in __call__
    self.manager.deferred_scalar_loader(self, toload)
  File "/var/www/finance/finance-env/lib/python3.2/site-packages/SQLAlchemy-0.9.5-py3.2-linux-x86_64.egg/sqlalchemy/orm/loading.py", line 563, in load_scalar_attributes
    (state_str(state)))
sqlalchemy.orm.exc.DetachedInstanceError: Instance <FundType at 0x3b5b150> is not bound to a Session; attribute refresh operation cannot proceed
2014-07-29 19:05:09011信息[sqlalchemy.engine.base.engine][MainThread]{}
2014-07-29 19:05:09014信息[sqlalchemy.engine.base.engine][MainThread]提交
2014-07-29 19:05:09022信息[sqlalchemy.engine.base.engine][MainThread]开始(隐式)
2014-07-29 19:05:09024信息[sqlalchemy.engine.base.engine][MainThread]插入fdt_基金类型(fdt_类型名称,fdt_usr_用户id)值(%(fdt_类型名称)s,%(fdt_usr_用户id)s)返回fdt_基金类型。fdt_基金类型id
2014-07-29 19:05:09024信息[sqlalchemy.engine.base.engine][main]{'fdt_type_name':'cash','fdt_usr_user_id':None}
2014-07-29 19:05:09025信息[sqlalchemy.engine.base.engine][MainThread]提交
回溯(最近一次呼叫最后一次):
文件“/var/www/finance/finance env/bin/initialize_corefinance_db”,第9行,在
加载入口点('corefinance==0.0','console\u scripts','initialize\u corefinance\u db')()
文件“/var/www/finance/corefinance/corefinance/scripts/initializedb.py”,主文件第45行
基金=基金(fds_name='Vanguard Prime Money Market fund',fds_symbol='vmmxx',fds_fdt_fund_type_id=基金类型.fdt_fund_type_id)
文件“/var/www/finance/finance env/lib/python3.2/site packages/SQLAlchemy-0.9.5-py3.2-linux-x86_64.egg/SQLAlchemy/orm/attributes.py”,第233行,在__
返回self.impl.get(实例\状态(实例),dict\状态)
文件“/var/www/finance/finance env/lib/python3.2/site packages/SQLAlchemy-0.9.5-py3.2-linux-x86_64.egg/SQLAlchemy/orm/attributes.py”,第577行,在get中
值=可调用(状态,被动)
文件“/var/www/finance/finance env/lib/python3.2/site packages/SQLAlchemy-0.9.5-py3.2-linux-x86_64.egg/SQLAlchemy/orm/state.py”,第422行,在__
self.manager.deferred\u标量\u加载器(self,toload)
文件“/var/www/finance/finance env/lib/python3.2/site packages/SQLAlchemy-0.9.5-py3.2-linux-x86_64.egg/SQLAlchemy/orm/loading.py”,第563行,在load_scalar_属性中
(州)
sqlalchemy.orm.exc.DetachedInstanceError:实例未绑定到会话;属性刷新操作无法继续

我的问题是,我对金字塔相当陌生,所以我不太确定正确的语法是什么,或者我是否应该在这里这样做。我似乎找不到任何例子,我也不确定“不绑定到会话”是什么意思。

经过更多的阅读和修改,我终于让它起作用了

事实证明,pyramid没有使用显式commit语句,因为它使用事务管理器

只需要一个flush语句来填充ID字段

def main(argv=sys.argv):
    if len(argv) < 2:
        usage(argv)
    config_uri = argv[1]
    options = parse_vars(argv[2:])
    setup_logging(config_uri)
    settings = get_appsettings(config_uri, options=options)
    engine = engine_from_config(settings, 'sqlalchemy.')
    DBSession.configure(bind=engine)
    Base.metadata.create_all(engine)

    with transaction.manager:
        fund_type = FundType(fdt_type_name='cash')
        DBSession.add(fund_type)
        DBSession.flush()

        fund = Fund(fds_name='Vanguard Prime Money Market Fund', fds_symbol='vmmxx', fds_fdt_fund_type_id=fund_type.fdt_fund_type_id)
        DBSession.add(fund)
def main(argv=sys.argv): 如果len(argv)<2: 用法(argv) config_uri=argv[1] options=parse_vars(argv[2:]) 设置日志(配置uri) 设置=获取应用设置(配置uri,选项=选项) engine=engine\u从配置(设置“sqlalchemy.”) DBSession.configure(绑定=引擎) Base.metadata.create_all(引擎) 使用transaction.manager: 基金类型=基金类型(fdt类型名称=现金) DBSession.add(基金类型) DBSession.flush() 基金=基金(fds_name='Vanguard Prime Money Market fund',fds_symbol='vmmxx',fds_fdt_fund_type_id=基金类型.fdt_fund_type_id) DBSession.add(基金)