Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 多对多关系上的SqlAlchemy外键错误_Python_Postgresql_Sqlalchemy_Flask Sqlalchemy - Fatal编程技术网

Python 多对多关系上的SqlAlchemy外键错误

Python 多对多关系上的SqlAlchemy外键错误,python,postgresql,sqlalchemy,flask-sqlalchemy,Python,Postgresql,Sqlalchemy,Flask Sqlalchemy,我试图在SqlAlchemy中建立一个基本的多对多关系。我能够使用db.create_all()成功创建数据库,但在尝试从数据库检索任何记录时遇到错误 class Geo(db.Model): __tablename__ = 'geos' geo = db.Column(db.Integer, primary_key=True) states = db.relationship("State", secondary='geos_states')

我试图在SqlAlchemy中建立一个基本的多对多关系。我能够使用db.create_all()成功创建数据库,但在尝试从数据库检索任何记录时遇到错误

class Geo(db.Model):
    __tablename__ = 'geos'

    geo = db.Column(db.Integer, primary_key=True)
    states = db.relationship("State", secondary='geos_states')



class State(db.Model):
    __tablename__ = 'states'

    state_short = db.Column(db.String, primary_key=True)
    geos = db.relationship("Geo", secondary='geos_states')



class GeoState(db.Model):
    __tablename__ = 'geos_states'

    id = db.Column(db.Integer, primary_key=True)
    geo_id = db.Column(db.Integer, db.ForeignKey('geos.geo')),
    state_short_id = db.Column(db.String, db.ForeignKey('states.state_short'))
错误如下:

sqlalchemy.exc.InvalidRequestError: One or more mappers failed to initialize - can't proceed with initialization of other mappers.  Original exception was: Could not determine join condition between parent/child tables on relationship Geo.states - there are no foreign keys linking these tables via secondary table 'geos_states'.  Ensure that referencing columns are associated with a ForeignKey or ForeignKeyConstraint, or specify 'primaryjoin' and 'secondaryjoin' expressions.

您正在使用的模式是SQLAlchemy中多关系模式的变体

通常,您将执行以下操作

geostates\u association\u table=表(
“地理州”,Base.metadata,
db.列(
“geo_id”,db.Integer,
db.ForeignKey('geos.geo')
),
db.列(
“state\u short\u id”,db.String,
db.ForeignKey('states.state_short')
)
)
地理等级(数据库模型):
__tablename_uuz='geos'
geo=db.Column(db.Integer,主键=True)
states=db.relationship(
“国家”,
次要=地质状态关联表,
返回\u填充class='geos'
)
类状态(db.Model):
__tablename_uu=‘states’
state_short=db.Column(
db.String,
主键=真
)
geos=db.relationship(
“Geo”,
次要=地质状态关联表,
后_居住在='states'
)
我认为这正是您所需要的,因为在多对多关系中,映射表上似乎不需要任何额外的列。但是,如果您这样做了,您将需要使用关联对象模式,这是您最初所做的。在这种情况下

class Geo(db.Model):
__tablename_uuz='geos'
geo=db.Column(
db.Integer,
主键=真
)
states=db.relationship(
“地球状态”,
back_populates=“geos”
)
类状态(db.Model):
__tablename_uu=‘states’
state_short=db.Column(
db.String,
主键=真
)
geos=db.relationship(
“地球状态”,
back_populates=“states”
)
类别地质状态(数据库模型):
__tablename_uuu='geos_states'
#注意我们如何在这两个字段上设置主键
geo_id=db.Column(
db.Integer,
db.ForeignKey('geos.geo'),
主键=真
),
state\u short\u id=db.Column(
db.String,
db.ForeignKey(“states.state_short”),
主键=真
),
some_other_field=db.Column(
字符串
)
geos=关系(“Geo”,back_populates=“states”)
状态=关系(“状态”,back_populates=“geos”)
请注意,在这种情况下,您在关系列表中得到的
State
Geo
实际上是
GeoState
对象。如果您希望使用关联对象模式,但关系列表由各自的对应对象填充。您可以使用AssociationProxy sqlalchemy扩展,您可以找到该扩展的文档

供参考

关联对象模式被记录下来


基本多对多模式已被记录

您使用的模式是SQLAlchemy中多对多关系模式的变体

通常,您将执行以下操作

geostates\u association\u table=表(
“地理州”,Base.metadata,
db.列(
“geo_id”,db.Integer,
db.ForeignKey('geos.geo')
),
db.列(
“state\u short\u id”,db.String,
db.ForeignKey('states.state_short')
)
)
地理等级(数据库模型):
__tablename_uuz='geos'
geo=db.Column(db.Integer,主键=True)
states=db.relationship(
“国家”,
次要=地质状态关联表,
返回\u填充class='geos'
)
类状态(db.Model):
__tablename_uu=‘states’
state_short=db.Column(
db.String,
主键=真
)
geos=db.relationship(
“Geo”,
次要=地质状态关联表,
后_居住在='states'
)
我认为这正是您所需要的,因为在多对多关系中,映射表上似乎不需要任何额外的列。但是,如果您这样做了,您将需要使用关联对象模式,这是您最初所做的。在这种情况下

class Geo(db.Model):
__tablename_uuz='geos'
geo=db.Column(
db.Integer,
主键=真
)
states=db.relationship(
“地球状态”,
back_populates=“geos”
)
类状态(db.Model):
__tablename_uu=‘states’
state_short=db.Column(
db.String,
主键=真
)
geos=db.relationship(
“地球状态”,
back_populates=“states”
)
类别地质状态(数据库模型):
__tablename_uuu='geos_states'
#注意我们如何在这两个字段上设置主键
geo_id=db.Column(
db.Integer,
db.ForeignKey('geos.geo'),
主键=真
),
state\u short\u id=db.Column(
db.String,
db.ForeignKey(“states.state_short”),
主键=真
),
some_other_field=db.Column(
字符串
)
geos=关系(“Geo”,back_populates=“states”)
状态=关系(“状态”,back_populates=“geos”)
请注意,在这种情况下,您在关系列表中得到的
State
Geo
实际上是
GeoState
对象。如果您希望使用关联对象模式,但关系列表由各自的对应对象填充。您可以使用AssociationProxy sqlalchemy扩展,您可以找到该扩展的文档

供参考

关联对象模式被记录下来

基本的多对多模式被记录下来