SQLAlchemy,添加具有外键约束依赖项的记录

问题描述

我是Flask-sqlAchemy和sqlAlchemy的新手,试图理解约束和关系,因此我从一个著名的数据库示例中编写了以下代码。每个Employee实例都属于一个Department,每个Department实例都有一个Employee作为经理。外键dnumber和mgRSSn都不能为null。该代码可以按预期工作,并创建与sql代码完全相同的架构。

from flask import Flask
from flask_sqlalchemy import sqlAlchemy

app = Flask(__name__)
app.config['sqlALCHEMY_DATABASE_URI'] = 'postgresql+psycopg2://postgres:<password>@<host>:<port>/<dbname>'
app.config['sqlALCHEMY_TRACK_MODIFICATIONS'] = False
db = sqlAlchemy(app)


class Employee(db.Model):
    __tablename__ = 'employee'
    __table_args__ = ({"schema": "public"})
    ssn = db.Column('ssn',db.String(11),primary_key=True)
    fname = db.Column('fname',db.String(20),nullable=False)
    lname = db.Column('lname',nullable=False)
    bdate = db.Column('bdate',db.Date,nullable=False)
    address = db.Column('address',db.String(50),nullable=False)
    sex = db.Column('sex',db.String(1),nullable=False)
    salary = db.Column('salary',db.Integer,nullable=False)

    # Relationship (1-1): Employee --has-> Employee (as supervisor)
    supeRSSn = db.Column('supeRSSn',db.ForeignKey('public.employee.ssn',name='supervisor'))
    emp_supervisor = db.relationship('Employee',backref=db.backref(name='supervisor',remote_side=ssn),lazy='dynamic')

    # Relationship (1-M): Department --has-> Employee(s)
    dnumber = db.Column('dnumber',db.ForeignKey("public.department.dnumber",name='department'),nullable=False)

    # Relationship (1-M): Employee(manager) --manages-> Department(s)
    dep_manager = db.relationship('Department',backref='manager',lazy='dynamic',foreign_keys="[Department.mgRSSn]",post_update=True)


class Department(db.Model):
    __tablename__ = "department"
    __table_args__ = ({"schema": "public"})
    dnumber = db.Column('dnumber',primary_key=True)
    dname = db.Column('dname',unique=True,nullable=False)

    # Relationship (1-M): Employee(manager) --manages-> Department(s)
    mgRSSn = db.Column('mgRSSn',db.ForeignKey("public.employee.ssn",name='manager'),nullable=False,unique=True)

    mgrstartdate = db.Column('mgrstartdate',nullable=False)

    # Relationship (1-M): Department --has-> Employee(s)
    employees = db.relationship('Employee',backref='department',foreign_keys="[Employee.dnumber]",post_update=True)

    def __repr__(self):
        return f'<Department> {self.dname}'

当我尝试插入行时,问题开始了,而在给定约束的情况下,我找不到正确的创建和更新实例的顺序。我做了一些测试,如下所示,它返回了明显的错误: “ sqlalchemy.exc.IntegrityError:(psycopg2.errors.NotNullViolation)列” dnumber“中的空值违反了非空约束 详细信息:失败行包含(888-66-5555,James E,Borg,1937-11-10,450 Stone ,。休斯顿,德克萨斯州,男,55000,888-66-5555,空)。

if __name__ == "__main__":

    db.create_all()

    emp1 = Employee(ssn='888-66-5555',fname='James E',lname='Borg',bdate='1937-11-10',address='450 Stone,. Houston,TX',sex='M',salary=55000,supeRSSn='888-66-5555')
    dep1 = Department(dnumber=5,dname='Research',mgrstartdate='1998-05-22')
    emp1.department = dep1
    db.session.add(emp1)
    dep1.manager = emp1
    db.session.add(dep1)
    db.session.commit()

使用带有WITH xxx AS INSERTsql语法,我可以控制插入语句的顺序。但是,当两个相关表中都存在外键时,我找不到在sqlAlchemy中实现该目标的方法

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)