【发布时间】:2018-07-17 20:59:00
【问题描述】:
我最近用过sqlacodegen
当我尝试运行生成的代码时,它会收到一条我无法修复的消息:
无法确定父/子表之间的连接条件 关系 Workgrp.usrmst - 有多个外键路径 链接表。指定 'foreign_keys' 参数,提供 应该被视为包含外国的那些列的列表 对父表的键引用。
我想知道是否有人可以阐明:
这是导致问题的相关表的生成代码:
class Workgrp(Owner):
__tablename__ = 'workgrp'
workgrp_id = Column(ForeignKey('owner.owner_id'), primary_key=True)
workgrp_prntid = Column(Numeric(scale=0, asdecimal=False))
workgrp_name = Column(String(256))
workgrp_desc = Column(String(4000))
workgrp_owner = Column(ForeignKey('usrmst.usrmst_id'))
workgrp_lstchgtm = Column(DateTime, index=True)
workgrp_externid = Column(String(20))
workgrp_profile = Column(Text)
workgrp_usrmodtm = Column(DateTime)
usrmst = relationship('Usrmst')
class Usrmst(Owner):
__tablename__ = 'usrmst'
__table_args__ = (
Index('usrmst_ak1', 'usrmst_domain', 'usrmst_name'),
)
usrmst_id = Column(ForeignKey('owner.owner_id'), primary_key=True)
usrmst_domain = Column(String(256))
usrmst_name = Column(String(256), nullable=False)
usrmst_fullname = Column(String(1024))
usrmst_desc = Column(String(4000))
usrmst_phoneno = Column(String(40))
usrmst_pagerno = Column(String(40))
usrmst_email = Column(String(1024))
usrmst_emailtype = Column(Numeric(scale=0, asdecimal=False))
secmst_id = Column(ForeignKey('secmst.secmst_id'))
lngmst_id = Column(ForeignKey('lngmst.lngmst_id'))
usrmst_password = Column(String(1024))
usrmst_externid = Column(String(20))
usrmst_suser = Column(String(1))
usrmst_lstchgtm = Column(DateTime, index=True)
usrmst_orapassword = Column(String(144))
usrmst_wingroup = Column(String(1))
usrmst_tmpacct = Column(String(1))
usrmst_profile = Column(Text)
usrmst_usrmodtm = Column(DateTime)
usrmst_principal = Column(String(256))
usrmst_keytab = Column(String(4000))
lngmst = relationship('Lngmst')
secmst = relationship('Secmst')
我查看了 SQLAlchemy 文档,并尝试使用
但最终收到如下消息:
- “表”对象没有属性“usrmst_id”
- AttributeError:“表”对象没有属性“workgrp_owner”
以下是DBeaver(基于 Eclipse 的 SQL Explorer 类型插件)中的一些相关原始表的截图:
我认为这不会有太大的不同,但我正在开发:
- Windows Server 2012 RC2
- 使用 Oracle 11g
- 使用 Python 3.6.4
- sqlacodegen 1.1.6
我在生成的代码之后添加了一个 sn-p,以及相关的导入..
engine = create_engine("oracle://<dbuser>:<dbpwd>@<host>:<port>/<db>")
Session = sessionmaker(bind=engine)
session = Session()
firstjm = session.query(Jobmst).first()
print(firstjm)
关于 sqlacodegen 生成代码的其他烦人的事情:
【问题讨论】:
标签: python-3.x sqlalchemy relationship sqlacodegen