Ich verwende MySQL 8.0 und SQLAlchemy. Meine ID-Spalte vergrößert sich nicht und ich verstehe nicht, warum.
SQLAlchemy-Modell:
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)
Knacken Sie den Code:
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()
Der ursprüngliche Fehler, den ich erhalten habe, war:
sqlalchemy.exc.DatabaseError: (mysql.connector.errors.DatabaseError) 1364 (HY000): Field 'id' doesn't have a default value
Basierend auf dieser Antwort habe ich den Indexparameter zu meiner ID-Spalte hinzugefügt und die Datei my.ini bearbeitet, um den STRICT_TRANS_TABLES
-Modus zu verlassen. Der neue Fehler ist:
sqlalchemy.exc.IntegrityError: (mysql.connector.errors.IntegrityError) 1062 (23000): Duplicate entry '0' for key 'shows.PRIMARY'
Alle Antworten, die ich in diesem Thema gefunden habe, betreffen AUTO_INCRMENT
,但 SQLAlchemy 文档说这应该是这里的默认值,因为它是一个整数主键,没有指定为 false。我确实尝试添加 autoincrement=True
nur für den Fall, aber wenn ich versuche, es zu migrieren, sagt mir Alembic, dass keine Änderungen festgestellt wurden.
从评论到问题:
不,这确实是它的工作原理。具体来说,对于像这样的模型
alembic 修订版 --autogenerate
将生成(没有显式指定
autoincrement=
)但是当alembic 升级 head
获取 SQLAlchemy 来实际创建 SQLAlchemy 发出的表没有。如上所示,首次创建表时,Alembic 会正确处理
AUTO_INCRMENT
。它没有检测到的是,具有现有表的 ORM 模型的列从autoincrement=False
更改为autoincrement=True
(反之亦然)。这是已知行为,如提交消息此处所示: p>
“请注意,此标志不支持更改列的“自动增量”状态,因为这不可跨后端移植。”
MySQL确实支持通过ALTER_TABLE更改列的AUTO_INCRMENT属性,因此我们可以通过更改“空”
upgrade
方法来实现至
渲染