Таким образом, я использовал sqlite
в качестве тестовой базы данных и у меня есть следующие классы в моем models.py
class User(UserMixin, db.Model):
__tablename__ = 'users'
id = db.Column(db.Integer, primary_key=True, index=True)
username = db.Column(db.String(40), unique=True, index=True)
password_hash = db.Column(db.String(256))
alternate_id = db.Column(db.String(100))
posts = db.relationship('Posts', backref='author', lazy=True)
def get_id(self):
return str(self.alternate_id)
def __init__(self, username, password):
self.username = username
self.password_hash = generate_password_hash(password)
self.alternate_id = my_serializer.dumps(
self.username + self.password_hash)
def verify_password(self, password):
if check_password_hash(self.password_hash, password):
return "True"
class Posts(db.Model):
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String(100), nullable=False, unique=True)
description = db.Column(db.String(1500))
author_id = db.Column(db.Integer, db.ForeignKey('users.id'))
def __init__(self, title, description, author_id):
self.title = title
self.description = description
self.author_id = author_id
Я добавил ограничение unique
для столбца title
в моем Posts
класс, а затем пытался обновить схему, используя Flask-Migrate
.
Изначально я получал No support for ALTER of constraints in SQLite dialect
ошибки, поскольку sqlite3
не поддерживает его через alembic
.Итак, я посмотрел документацию по alembic и обнаружил, что вы действительно можете выполнять такие миграции, используя миграции в режиме batch
.Поэтому я обновил свой скрипт миграции, как показано ниже.
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
with op.batch_alter_table("posts") as batch_op:
batch_op.create_unique_constraint('unique_title', ['title'])
# ### end Alembic commands ###
Теперь, когда я пытаюсь запустить flask db upgrade
, я получаю следующую ошибку
sqlalchemy.exc.IntegrityError: (sqlite3.IntegrityError) UNIQUE constraint failed: _alembic_tmp_posts.title [SQL: 'INSERT INTO
_alembic_tmp_posts (id, title, description, author_id) SELECT posts.id, posts.title, posts.description, posts.author_id \nFROM posts'] (Background on this error at: http://sqlalche.me/e/gkpj`)
Я не могу понять, почему IntegrityError
создается исключение, потому что, если я посмотрю на оператор insert
, количество столбцов будет одинаковым.
Имеет ли это какое-то отношение к столбцу authors_id
, имеющему ограничение foreignkey
?