首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQlAlchemy:无法根据关系错误消息确定父/子表之间的连接条件

SQlAlchemy:无法根据关系错误消息确定父/子表之间的连接条件
EN

Stack Overflow用户
提问于 2018-02-07 14:14:21
回答 1查看 2.9K关注 0票数 0

我最近使用了[医]二乳精

当我试图针对生成的代码运行时,它会得到无法修复的消息:

无法确定关系Workgrp.usrmst上父/子表之间的连接条件-有多个外键路径链接这些表。指定'foreign_keys‘参数,提供那些列的列表,这些列应该被计算为包含对父表的外键引用。

我想知道是否有人能给我一些启示:

以下是导致此问题的相关表的生成代码:

代码语言:javascript
复制
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 (基于Explorer类型插件)中的原始表相关的屏幕截图:

我不认为这会有多大的影响,但我正在开发:

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

我在生成的代码之后添加了一个片段,其中包含了相关的导入。

代码语言:javascript
复制
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的代码,行经常会忽略字符的限制,所以您必须重新格式化长比较字符串'x‘到' x’‘x’等等,
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-02-07 19:43:47

最后,我在Google的高级搜索中找到了语法糖这个确切的词:

  • “无法确定关系上父表/子表之间的联接条件”
  • 在域中:http://docs.sqlalchemy.org/
  • 这产生了这样的结果:paths#处理-多连接路径
  • 从这一点来看,这似乎符合要求:
代码语言:javascript
复制
usrmst = relationship('Usrmst', foreign_keys=[workgrp_owner])

我还为基类重写了__repr__的默认实现,该实现由:

Base = declarative_base()

对此:

代码语言:javascript
复制
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脚本中,我用我的微调导入生成的代码,并有如下代码:

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

Jobmst是一个类,表示我导入的表。这表示打印生成的某种内容,客户数据由.取代。表名,然后是包含每个列名及其作为键/值对的数据的元组:

代码语言:javascript
复制
<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": "...."})>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48666026

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档