Я передал 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 обоих пользователей. и модель дохода. Нужно быстрое решение этой проблемы. Это из-за какой-то ошибки или что-то не так с моим кодом?