繁体   English   中英

Flask-SqlAlchemy关系错误

[英]Flask-SqlAlchemy relationship error

这是我有的简单模型

  class Record(db.Model):
      __tablename__ = 'reg_records'
      request_id = db.Column(db.Integer, primary_key = True)
      title = db.Column(NVARCHAR())

  class Field(db.Model):
      __tablename__ = 'reg_fields'
      request_id = db.Column(db.Integer, primary_key= True) 
      name = db.Column(NVARCHAR(), primary_key = True)

现在,我想映射相关的字段进行记录。 我正在遵循flask-sqlalchemy规格并获取此

  class Field(db.Model):
      __tablename__ = 'reg_fields'
      request_id = db.Column(db.Integer, ForeignKey('record.request_id'), primary_key= True) 
      name = db.Column(NVARCHAR(), primary_key = True)

  class Record(db.Model):
      __tablename__ = 'reg_records'
      request_id = db.Column(db.Integer, primary_key = True)
      title = db.Column(NVARCHAR())
      fields = db.relationship(Field, backref = 'record')

但是,当我尝试使用此模型时,出现以下错误

  sqlalchemy.exc.NoForeignKeysError
  NoForeignKeysError: Could not determine join condition between parent/child tables on relationship Record.fields - there are no foreign keys linking these tables.  Ensure that referencing columns are associated with a ForeignKey or ForeignKeyConstraint, or specify a 'primaryjoin' expression.

primaryjoin添加到关系声明中,如下所示

    fields = db.relationship(Field, backref = 'record', primaryjoin='Record.request_id==Field.request_id')

无法解决问题,而是给出了新的例外

    sqlalchemy.exc.NoReferencedTableError
    NoReferencedTableError: Foreign key associated with column 'reg_fields.request_id' could not find table 'record' with which to generate a foreign key to target column 'request_id'

如果我将类名替换为primaryjoin值中的表名,

    fields = db.relationship(Field, backref = 'record', primaryjoin='reg_records.request_id==reg_fields.request_id')

我又遇到另一个例外

   sqlalchemy.exc.InvalidRequestError
   InvalidRequestError: One or more mappers failed to initialize - can't proceed with initialization of other mappers.  Original exception was: 'Table' object has no attribute 'request_id' 

总体而言,在flask-sqlalchemy中建立一对多关系的正确方法是什么。

目前尚不清楚您要做什么。 我假设您正在尝试在记录和字段之间建立一对多关系(一个记录可以有零个或多个字段)。 我还假设您希望每个记录仅具有一个名为name的字段。 我认为您希望使用以下模型来设置表和关系:

from sqlalchemy.schema import UniqueConstraint

class Record(db.Model):
    __tablename__ = 'reg_records'

    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(NVARCHAR())


class Field(db.Model):
    __tablename__ = 'reg_fields'
    __table_args__ = (
        UniqueConstraint('record_id', 'name', name='record_id_name_uix'),
    )

    id = db.Column(db.Integer, primary_key=True)
    record_id = db.Column(db.Integer, ForeignKey(Record.id))
    name = db.Column(NVARCHAR())

    record = db.relationship(Record, backref='fields')

现在,您可以执行诸如创建新的记录和字段的操作:

record = Record(title='a record')
record.fields.append(Field(name='field1'))
record.fields.append(Field(name='field2'))
db.session.add(record)
db.session.commit()

但是,尝试为同一条记录创建两个具有相同名称的字段,尝试提交它们时会收到IntegrityError:

record = Record(title='another record')
record.fields.append(Field(name='same_name'))
record.fields.append(Field(name='same_name'))
db.session.add(record)
db.session.commit()

最后,请尝试更加谨慎地设置Python代码的格式,很难理解。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM