SQlAlchemy:无法确定关系错误消息

时间:2018-02-07 14:14:21

标签: python-3.x sqlalchemy relationship sqlacodegen

我最近使用过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类型插件的相关原始表的截图:

USRMST WRKGRP

我不认为它应该有很大的不同,但我正在开发:

  • Windows Server 2012 RC2
  • 使用Oracle 11g
  • 使用Python 3.6.4
  • sqlacodegen 1.1.6

我在生成的代码后添加了一个代码段,并附带相关的导入..

engine = create_engine("oracle://<dbuser>:<dbpwd>@<host>:<port>/<db>")
Session = sessionmaker(bind=engine)
session = Session()
firstjm = session.query(Jobmst).first()
print(firstjm)

有关sqlacodegen生成代码的其他恼人的事情:

  • 没有生成__repr____str__的字符串实现,因此打印出的表一般不会列出表名,后跟键,值对列和它们的值列表。

  • 声称是PEP兼容的代码,行通常会破坏字符限制,因此您必须重新格式化长的比较字符串&#39; x x&#39;进入&#39; x&#39; &#39; X&#39;等,

1 个答案:

答案 0 :(得分:0)

我终于在确切的术语中找到了使用Google高级搜索的语法糖:

usrmst = relationship('Usrmst', foreign_keys=[workgrp_owner])

我还为以下定义的Base类重写了__repr__的默认实现:

Base = declarative_base()

到此:

import json
def tablerepr(self):
    return "<{}: ({})>".format(self.__table__,
                             json.dumps(
                                dict(
                                    list(
                                        self.__dict__.items()
                                        )[1:]
                                 ), default=str)
                             )
Base.__repr__ = tablerepr

我在找到SQLAlchemy吐出的对象时找到的有用链接:

所以我最终将tablerepr方法添加到我的主生成代码中。

然后在一个单独的python脚本中,我使用我的调整导入生成的代码,并且代码如下:

engine = create_engine("oracle://<user>:<password>@<host>:<port>/<db>")
inspector = inspect(engine)
Session = sessionmaker(bind=engine)
session = Session()
print(session.query(Jobmst).first())

Jobmst是一个表示我导入的表的类。这表示打印然后生成的内容类型,客户数据替换为....表名,然后是包含每个列名称的元组,它的数据作为键/值对:

<jobmst: ({"jobmst_id": 1590.0, "jobmst_alias": "1590", "jobmst_owner": 67.0, "jobmst_type": 1.0, "jobmst_dirty": "0", "jobmst_desc": null, "jobmst_vars": null, "jobmst_prntid": 1589.0, "jobmst_crttm": "2001-06-18 10:38:19", "jobmst_active": "N", "jobmst_usrmodtm": "2001-06-29 20:27:06", "jobdtl_id": 1591.0, "evntmst_id": null, "bizunit_id": null, "jobmst_lstchgtm": "2001-06-29 20:27:06", "jobmst_evntoffset": null, "jobmst_desc_type": null, "jobmst_runbook": null, "jobmst_name": "....", "jobmst_runbook_type": null, "jobcls_id": 32.0, "jobmst_mode": null, "jobmst_prntname": "...."})>
相关问题