Нарушение ограничения foreignkey, не допускающего значения null, в sqlalchemy

У меня проблема с конфигурацией моей базы данных в том, что ограничение ForeignKey настроено не равным нулю, но происходят родительские события удаления, оставляя ForeignKey указывающим на несуществующий идентификатор. Вот минимальный пример, который не генерирует IntegrityError. Конечно, мне это нужно, чтобы сгенерировать ошибку при последней фиксации ..

from flask import Flask
from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()
app = Flask(__name__)
app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:////INSERT_PATH_HERE/data-test-scratch.sqlite'
db.init_app(app)
app.app_context().push()

class User(db.Model):
    __tablename__ = 'user'
    id = db.Column(db.Integer, primary_key=True)

class Attachment(db.Model):
    __tablename__ = 'attachment'
    id = db.Column(db.Integer, primary_key=True)
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)
    user = db.relationship('User', uselist=False)

db.drop_all()
db.create_all()

user = User()
db.session.add(user)
db.session.flush()
attachment = Attachment(user_id=user.id)
db.session.add(attachment)
db.session.commit()
db.session.delete(user)
db.session.commit()
print(attachment.user, attachment.user_id) # (None, 1)

Примечание. Я разрабатываю тестирование в SQLlite, но производством будет Postgres. Интересно, есть ли различия в поведении по умолчанию для этих двух конфигураций?

SQLite по умолчанию не применяет ограничения внешнего ключа. Их включение описано в stackoverflow.com/questions/2614984/….

Ilja Everilä 31.10.2018 12:14

Есть ли у Postgres? Есть ли какие-либо варианты заставить его сделать так, чтобы он отражал среду postgres? Или есть какие-то параметры, которые я могу явно указать в моей модели SQLAlchemy, которые будут работать с обоими типами баз данных?

Attack68 31.10.2018 12:19

@ IljaEverilä благодарит за ссылку. Реализовано решение KiranJonnalagadda, и теперь для подключений SQLite генерируется IntegrityError.

Attack68 31.10.2018 12:31

Postgres прямо из коробки применяет ограничения внешнего ключа.

Ilja Everilä 31.10.2018 12:58
1
4
41
0

Другие вопросы по теме