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(基金)