微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

SQLAlchemy:表有多个外键约束关系

如何解决SQLAlchemy:表有多个外键约束关系

我正在开发一个用于学校管理的新数据库。我现在使用 MysqL 已经很长时间了,但我对 python 和 sqlalchemy 还是很陌生。首先我设计了(巨大的)数据库,然后使用flask-sqlacodegen生成了类...... 问题: 我有两张桌子:人和员工。 in person,所有人都被存储,每个数据集都有一个 mod_user。在员工中,只存储公司员工。 mod_user 必须是员工...

这是我的员工/个人课程:

#connect_test.py
from flask import Flask
from flask_sqlalchemy import sqlAlchemy

app = Flask(__name__)
app.config['sqlALCHEMY_TRACK_MODIFICATIONS'] = False
app.config['sqlALCHEMY_DATABASE_URI'] = 'MysqL://XXX:XXX@localhost/schooldb_model'
db = sqlAlchemy(app)


class TPerson(db.Model):
    __tablename__ = 't_person'

    idt_person = db.Column(db.Integer,primary_key=True,info='ID der Person')
    salutation = db.Column(db.String(10),nullable=False,server_default=db.FetchedValue(),info='Anrede - Geschlecht der Person ist daraus ersichtlich')
    firstname = db.Column(db.String(45),info='Vorname')
    lastname = db.Column(db.String(45),info='Nachname')
    birthdate = db.Column(db.Date,info='Geburtsdatum - wird 1900-01-01 gesetzt wenn nicht bekannt')
    birthplace = db.Column(db.String(45),info='Geburtsort')
    cityzenship = db.Column(db.String(45),info='Staatsbürgerschaft')
    familystatus = db.Column(db.String(30),server_default=db.FetchedValue())
    dmtx_idt = db.Column(db.LargeBinary)
    qr_idt = db.Column(db.LargeBinary)
    mod_timestamp = db.Column(db.DateTime,index=True,info='Timestamp of modification')
    mod_user = db.Column(db.ForeignKey('t_staff.t_person_idt_person'),index=True)

    t_staff = db.relationship('TStaff',primaryjoin='TPerson.mod_user == TStaff.t_person_idt_person',backref='t_people')
    #mod_user = db.Column(db.Integer,server_default=db.FetchedValue())


class TStaff(TPerson):
    __tablename__ = 't_staff'

    t_person_idt_person = db.Column(db.ForeignKey('t_person.idt_person'),info='Person id')
    begin = db.Column(db.Date,info='Ist Mitarbeitr seit.')
    end = db.Column(db.Date,info='War Mitarbeiter bis.')

从 python 控制台运行代码 >>> from connect_test import TPerson 结果是: sqlalchemy.exc.AmbiguousForeignKeysError: Can't determine join between 't_person' and 't_staff'; tables have more than one foreign key constraint relationship between them. Please specify the 'onclause' of this join explicitly.

我知道,在这种特殊情况下,我真的不需要 mod_users 外键约束 - 删除它并执行 mod_user = db.Column(db.Integer,server_default=db.FetchedValue()) 工作正常。 但是我在数据库的其余部分有很多其他限制,我无法删除 - 所以我希望解决这个问题很容易?案例将帮助我理解其余的...... 问候,c。

解决方法

@above_c_level:非常感谢! - 有用。只好换个条件。 完整代码如下:

class TPerson(db.Model):
    __tablename__ = 't_person'

    idt_person = db.Column(db.Integer,primary_key=True,info='ID der Person')
    salutation = db.Column(db.String(10),nullable=False,server_default=db.FetchedValue(),info='Anrede - Geschlecht der Person ist daraus ersichtlich')
    firstname = db.Column(db.String(45),info='Vorname')
    lastname = db.Column(db.String(45),info='Nachname')
    birthdate = db.Column(db.Date,info='Geburtsdatum - wird 1900-01-01 gesetzt wenn nicht bekannt')
    birthplace = db.Column(db.String(45),info='Geburtsort')
    cityzenship = db.Column(db.String(45),info='Staatsbürgerschaft')
    familystatus = db.Column(db.String(30),server_default=db.FetchedValue())
    dmtx_idt = db.Column(db.LargeBinary)
    qr_idt = db.Column(db.LargeBinary)
    mod_timestamp = db.Column(db.DateTime,index=True,info='Timestamp of modification')
    mod_user = db.Column(db.ForeignKey('t_staff.t_person_idt_person'),index=True)

    t_staff = db.relationship('TStaff',primaryjoin='TPerson.mod_user == TStaff.t_person_idt_person',backref='people')


class TStaff(TPerson):
    __tablename__ = 't_staff'

    t_person_idt_person = db.Column(db.ForeignKey('t_person.idt_person'),info='Person id')
    begin = db.Column(db.Date,info='Ist Mitarbeitr seit.')
    end = db.Column(db.Date,info='War Mitarbeiter bis.')
    # person = db.relationship('TPerson',primaryjoin='TPerson.idt_person == TStaff.t_person_idt_person',#                         backref='staff')
    __mapper_args__ = {'polymorphic_identity': 'staff','inherit_condition': TPerson.idt_person == t_person_idt_person}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。