Добавление ограничения UniqueKey к таблице sqlite3 с помощью Flask-Migration завершается неудачно с IntrgrityError - PullRequest
0 голосов
/ 13 февраля 2019

Таким образом, я использовал 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?

1 Ответ

0 голосов
/ 14 февраля 2019

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

Поэтому, как только я удалил одну из повторяющихся строк, обновление базы данных прошло успешно.

...