Python SQLAlchemy 为什么我在 FK 上收到 NoReferencedTableError
Python SQLAlchemy why am I getting a NoReferencedTableError on a FK
我继承了一个 SQLAlchemy 项目,需要一些帮助来弄清楚为什么一种关系的行为似乎与其他所有关系不同。我们的 orm 模型是由脚本生成的,因此我假设所有模型都可以工作或不工作。
当我尝试使用 FK 在 table 上插入时,我收到以下错误消息:
与列 'RenewalBatchGroup.renewalbatchfrequencyid' 相关联的外键无法找到 table 'RenewalBatchFrequency' 用于生成目标列 'renewalbatchfrequencyid'
的外键
在下面的代码中,我得到了 NoReferencedTableError 异常。但是,如果我将导入从 Frequency importing Group 更改为相反的方式,它确实有效。
即:
从 RenewalBatchFrequency.py 中删除以下内容
"from app.orm.LROCustomer.dbo.RenewalBatchGroup import RenewalBatchGroup"
并将以下内容添加到 RenewalBatchGroup.py
来自 app.orm.LROCustomer.dbo.RenewalBatchFrequency 导入 RenewalBatchFrequency
我需要知道为什么这种关系的行为与 RenewalBatch 关系等其他关系不同。它的设置方式完全相同。
RenewalBatchGroup.py
from sqlalchemy.dialects.mssql import *
from sqlalchemy import Column, ForeignKey
from sqlalchemy.orm import relationship
from app.DatabaseCore import Base
from Utils.DateTimeUtils import getDateTimeString
from app.orm.LROCustomer.dbo.RenewalBatch import RenewalBatch
from app.orm.LROCustomer.dbo.RenewalBatchGroupProperty import RenewalBatchGroupProperty
class RenewalBatchGroup(Base):
__tablename__ = 'RenewalBatchGroup'
__table_args__ = {'implicit_returning': False} # http://docs.sqlalchemy.org/en/latest/dialects/mssql.html#triggers
batchleadtime = Column(SMALLINT)
batchsize = Column(SMALLINT)
groupname = Column(VARCHAR(400))
offerstatusid = Column(INTEGER)
renewalbatchfrequencyid = Column(INTEGER, ForeignKey('RenewalBatchFrequency.renewalbatchfrequencyid'))
renewalbatchfrequencyvalue = Column(VARCHAR(100))
renewalbatchgroupid = Column(INTEGER, primary_key=True)
updateuser = Column(VARCHAR(254))
RenewalBatches = relationship("RenewalBatch", backref="RenewalBatchGroup")
RenewalBatchGroupPropertys = relationship("RenewalBatchGroupProperty", backref="RenewalBatchGroup")
def jsonify(self):
return {"batchleadtime": self.batchleadtime,
"batchsize": self.batchsize,
"groupname": self.groupname,
"offerstatusid": self.offerstatusid,
"renewalbatchfrequencyid": self.renewalbatchfrequencyid,
"renewalbatchfrequencyvalue": self.renewalbatchfrequencyvalue,
"renewalbatchgroupid": self.renewalbatchgroupid,
"updateuser": self.updateuser
}
def update(self, row):
self.batchleadtime = row.batchleadtime
self.batchsize = row.batchsize
self.groupname = row.groupname
self.offerstatusid = row.offerstatusid
self.renewalbatchfrequencyid = row.renewalbatchfrequencyid
self.renewalbatchfrequencyvalue = row.renewalbatchfrequencyvalue
self.updateuser = row.updateuser
RenewalBatchFrequency.py
from sqlalchemy.dialects.mssql import *
from sqlalchemy import Column, ForeignKey
from sqlalchemy.orm import relationship
from app.DatabaseCore import Base
from Utils.DateTimeUtils import getDateTimeString
from app.orm.LROCustomer.dbo.RenewalBatchGroup import RenewalBatchGroup
class RenewalBatchFrequency(Base):
__tablename__ = 'RenewalBatchFrequency'
__table_args__ = {'implicit_returning': False} # http://docs.sqlalchemy.org/en/latest/dialects/mssql.html#triggers
name = Column(VARCHAR(100))
renewalbatchfrequencyid = Column(INTEGER, primary_key=True)
RenewalBatchGroups = relationship("RenewalBatchGroup", backref="RenewalBatchFrequency")
def jsonify(self):
return {"name": self.name,
"renewalbatchfrequencyid": self.renewalbatchfrequencyid
}
def update(self, row):
self.name = row.name
如果需要任何其他信息,请告诉我。
谢谢。
如上所述,我可以通过反转导入语句来解决问题。这与所有其他关系相反。我只能假设 SQLAlchemy 正在处理的其他关系以某种方式存在循环引用。
我解决这个问题的方法是将我所有的模型导入到 __ init__.py 文件中,因此每个模型都可以访问所有模型。现在,当我生成一个新模型时,我只需要确保它已添加到 __ init__.py 文件中,我就可以开始了。
一次非常令人沮丧的经历。
我继承了一个 SQLAlchemy 项目,需要一些帮助来弄清楚为什么一种关系的行为似乎与其他所有关系不同。我们的 orm 模型是由脚本生成的,因此我假设所有模型都可以工作或不工作。
当我尝试使用 FK 在 table 上插入时,我收到以下错误消息:
与列 'RenewalBatchGroup.renewalbatchfrequencyid' 相关联的外键无法找到 table 'RenewalBatchFrequency' 用于生成目标列 'renewalbatchfrequencyid'
的外键在下面的代码中,我得到了 NoReferencedTableError 异常。但是,如果我将导入从 Frequency importing Group 更改为相反的方式,它确实有效。
即: 从 RenewalBatchFrequency.py 中删除以下内容 "from app.orm.LROCustomer.dbo.RenewalBatchGroup import RenewalBatchGroup"
并将以下内容添加到 RenewalBatchGroup.py 来自 app.orm.LROCustomer.dbo.RenewalBatchFrequency 导入 RenewalBatchFrequency
我需要知道为什么这种关系的行为与 RenewalBatch 关系等其他关系不同。它的设置方式完全相同。
RenewalBatchGroup.py
from sqlalchemy.dialects.mssql import *
from sqlalchemy import Column, ForeignKey
from sqlalchemy.orm import relationship
from app.DatabaseCore import Base
from Utils.DateTimeUtils import getDateTimeString
from app.orm.LROCustomer.dbo.RenewalBatch import RenewalBatch
from app.orm.LROCustomer.dbo.RenewalBatchGroupProperty import RenewalBatchGroupProperty
class RenewalBatchGroup(Base):
__tablename__ = 'RenewalBatchGroup'
__table_args__ = {'implicit_returning': False} # http://docs.sqlalchemy.org/en/latest/dialects/mssql.html#triggers
batchleadtime = Column(SMALLINT)
batchsize = Column(SMALLINT)
groupname = Column(VARCHAR(400))
offerstatusid = Column(INTEGER)
renewalbatchfrequencyid = Column(INTEGER, ForeignKey('RenewalBatchFrequency.renewalbatchfrequencyid'))
renewalbatchfrequencyvalue = Column(VARCHAR(100))
renewalbatchgroupid = Column(INTEGER, primary_key=True)
updateuser = Column(VARCHAR(254))
RenewalBatches = relationship("RenewalBatch", backref="RenewalBatchGroup")
RenewalBatchGroupPropertys = relationship("RenewalBatchGroupProperty", backref="RenewalBatchGroup")
def jsonify(self):
return {"batchleadtime": self.batchleadtime,
"batchsize": self.batchsize,
"groupname": self.groupname,
"offerstatusid": self.offerstatusid,
"renewalbatchfrequencyid": self.renewalbatchfrequencyid,
"renewalbatchfrequencyvalue": self.renewalbatchfrequencyvalue,
"renewalbatchgroupid": self.renewalbatchgroupid,
"updateuser": self.updateuser
}
def update(self, row):
self.batchleadtime = row.batchleadtime
self.batchsize = row.batchsize
self.groupname = row.groupname
self.offerstatusid = row.offerstatusid
self.renewalbatchfrequencyid = row.renewalbatchfrequencyid
self.renewalbatchfrequencyvalue = row.renewalbatchfrequencyvalue
self.updateuser = row.updateuser
RenewalBatchFrequency.py
from sqlalchemy.dialects.mssql import *
from sqlalchemy import Column, ForeignKey
from sqlalchemy.orm import relationship
from app.DatabaseCore import Base
from Utils.DateTimeUtils import getDateTimeString
from app.orm.LROCustomer.dbo.RenewalBatchGroup import RenewalBatchGroup
class RenewalBatchFrequency(Base):
__tablename__ = 'RenewalBatchFrequency'
__table_args__ = {'implicit_returning': False} # http://docs.sqlalchemy.org/en/latest/dialects/mssql.html#triggers
name = Column(VARCHAR(100))
renewalbatchfrequencyid = Column(INTEGER, primary_key=True)
RenewalBatchGroups = relationship("RenewalBatchGroup", backref="RenewalBatchFrequency")
def jsonify(self):
return {"name": self.name,
"renewalbatchfrequencyid": self.renewalbatchfrequencyid
}
def update(self, row):
self.name = row.name
如果需要任何其他信息,请告诉我。
谢谢。
如上所述,我可以通过反转导入语句来解决问题。这与所有其他关系相反。我只能假设 SQLAlchemy 正在处理的其他关系以某种方式存在循环引用。
我解决这个问题的方法是将我所有的模型导入到 __ init__.py 文件中,因此每个模型都可以访问所有模型。现在,当我生成一个新模型时,我只需要确保它已添加到 __ init__.py 文件中,我就可以开始了。
一次非常令人沮丧的经历。