【问题标题】:SQlAlchemy: Could not determine join condition between parent/child tables on relationship error messageSQLAlchemy:无法在关系错误消息中确定父/子表之间的连接条件
【发布时间】: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 生成代码的其他烦人的事情:

  • 没有生成 __repr____str__ 的字符串实现,因此打印出的表通常不会列出表名,后跟键、值对列表的列及其值。

  • 声称是符合 PEP 的代码,行经常超出字符限制,因此您必须将长比较字符串 'xx' 重新格式化为 'x' 'x' 等,

【问题讨论】:

    标签: python-3.x sqlalchemy relationship sqlacodegen


    【解决方案1】:

    我终于在谷歌高级搜索中找到了句法糖:


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

    我还为以下定义的基类覆盖了__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": "...."})>
    

    【讨论】:

      猜你喜欢
      • 2022-01-11
      • 2016-03-18
      • 2020-12-27
      • 2017-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-18
      • 2019-09-25
      相关资源
      最近更新 更多