问题描述
我是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 INSERT
的sql语法,我可以控制插入语句的顺序。但是,当两个相关表中都存在外键时,我找不到在sqlAlchemy中实现该目标的方法?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)