Saya menggunakan MySQL 8.0 dan SQLAlchemy. Lajur id saya tidak meningkat dan saya tidak faham mengapa.
Model SQLAlchemy:
class Show(db.Model): __tablename__ = "shows" id = Column(Integer, primary_key=True, index=True) name = Column(String) type = Column(String) status = Column(String) episodes = Column(Integer) series_entry_id = Column(Integer, ForeignKey("series.id")) series_id = Column(Integer, ForeignKey("series.id")) lists = relationship("List", secondary=show_list, back_populates="shows") recommendations = relationship("Recommendation", backref=backref("shows")) user_ratings = relationship("Rating", backref=backref("shows")) alt_names = relationship("User", secondary=alt_names, back_populates="alt_show_names") series_entry = relationship("Series", foreign_keys=[series_entry_id], uselist=False) series = relationship("Series", foreign_keys=[series_id], post_update=True)
Kotak kod:
show = Show( name=new_data["title"]["english"], type=new_data["format"], status=new_data["status"], episodes=new_data["episodes"], ) db.session.add(show) db.session.commit()
Ralat asal yang saya terima ialah:
sqlalchemy.exc.DatabaseError: (mysql.connector.errors.DatabaseError) 1364 (HY000): Field 'id' doesn't have a default value
Berdasarkan jawapan ini, saya menambah parameter indeks pada lajur id saya dan mengedit fail my.ini untuk mengeluarkannya daripada mod STRICT_TRANS_TABLES
. Ralat baharu ialah:
sqlalchemy.exc.IntegrityError: (mysql.connector.errors.IntegrityError) 1062 (23000): Duplicate entry '0' for key 'shows.PRIMARY'
Semua jawapan yang saya temui dalam topik ini melibatkan AUTO_INCRMENT
,但 SQLAlchemy 文档说这应该是这里的默认值,因为它是一个整数主键,没有指定为 false。我确实尝试添加 autoincrement=True
untuk berjaga-jaga, tetapi apabila saya cuba memindahkannya, alembic memberitahu saya bahawa tiada perubahan dikesan.
Dari komen kepada soalan:
Tidak, ini adalah cara ia berfungsi. Khususnya, untuk model seperti ini
alembic 修订版 --autogenerate
akan menjana(tanpa menyatakan secara eksplisit
autoincrement=
)但是当alembic 升级 head
Dapatkan SQLAlchemy untuk benar-benar mencipta jadual yang SQLAlchemy keluarkanTidak. Seperti yang ditunjukkan di atas, Alembic mengendalikan
AUTO_INCRMENT
。它没有检测到的是,具有现有表的 ORM 模型的列从autoincrement=False
更改为autoincrement=True
dengan betul apabila jadual pertama kali dibuat (dan sebaliknya).Ini adalah tingkah laku yang diketahui, seperti yang ditunjukkan dalam mesej komit di sini : p>
"Sila ambil perhatian bahawa bendera ini menyokong menukar status "auto-kenaikan" lajur, kerana ini tidak mudah alih merentasi bahagian belakang
MySQL menyokong menukar atribut AUTO_INCRMENT lajur melalui ALTER_TABLE, jadi kita boleh melakukannya dengan menukar kaedah "null"
kepadaupgrade