flask_migrate Длина столбца BIGINT игнорируется в первый раз при MySQL - PullRequest
0 голосов
/ 04 марта 2020

Я передал compare_type=True конструктору Mirate.

migrate = Migrate(app, db, compare_type=True)

Мои модели следующие:

class User(db.Model):
    __tablename__ = 'user'
    id = Column(mysql.BIGINT(20, unsigned=True),
                nullable=False, primary_key=True)
    name = Column(mysql.VARCHAR(50), unique=True, nullable=False)
    email = Column(mysql.VARCHAR(50), unique=True, nullable=False)
    income = db.relationship(Income, backref="user")

class Income(db.Model):
    __tablename__ = 'income'
    id = Column(mysql.BIGINT(20, unsigned=True),
                nullable=False, primary_key=True)
    user_id = Column(mysql.BIGINT(20, unsigned=True), db.ForeignKey('user.id'),
                     nullable=False)
    year = Column(Integer, nullable=False)

Теперь flask db init, flask db migrate работает отлично. flask db upgrade даже создает таблицы. но длина поля BIGINT игнорируется. Мой первый вопрос: почему это происходит ?

А во-вторых, когда я пытаюсь выполнить миграцию снова с flask db migrate, я получаю следующий вывод:

INFO  [alembic.runtime.migration] Context impl MySQLImpl.
INFO  [alembic.runtime.migration] Will assume non-transactional DDL.
INFO  [alembic.autogenerate.compare] Detected type change from BIGINT(unsigned=True) to BIGINT(display_width=20, unsigned=True) on 'income.id'
INFO  [alembic.autogenerate.compare] Detected type change from BIGINT(unsigned=True) to BIGINT(display_width=20, unsigned=True) on 'income.user_id'
INFO  [alembic.autogenerate.compare] Detected type change from BIGINT(unsigned=True) to BIGINT(display_width=20, unsigned=True) on 'user.id'

Это странно, потому что в первый раз он проигнорировал длину, а теперь он определяет ее как изменение типа. После этого, если я пытаюсь обновить с помощью flask db upgrade, я получаю следующую ошибку:

sqlalchemy.exc.DataError: (MySQLdb._exceptions.DataError) (1171, 'All parts of a PRIMARY KEY must be NOT NULL; if you need NULL in a key, use UNIQUE instead')
[SQL: ALTER TABLE income MODIFY id BIGINT(20) UNSIGNED NULL AUTO_INCREMENT]
(Background on this error at: http://sqlalche.me/e/9h9h)

Теперь это не должно происходить, так как я уже использовал nullable=False в поле id обоих пользователей. и модель дохода. Нужно быстрое решение этой проблемы. Это из-за какой-то ошибки или что-то не так с моим кодом?

...