我正在使用 MySQL 8.0 和 SQLAlchemy。我的 id 列沒有增加,我不明白為什麼。
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)
破解程式碼:
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()
我收到的原始錯誤是:
sqlalchemy.exc.DatabaseError: (mysql.connector.errors.DatabaseError) 1364 (HY000): Field 'id' doesn't have a default value
根據這個答案,我將索引參數新增到我的 id 欄位中,並編輯 my.ini 檔案以使其脫離 STRICT_TRANS_TABLES
模式。新的錯誤是:
sqlalchemy.exc.IntegrityError: (mysql.connector.errors.IntegrityError) 1062 (23000): Duplicate entry '0' for key 'shows.PRIMARY'
我在該主題中找到的所有答案都涉及 AUTO_INCRMENT
,但 SQLAlchemy 文件說這應該是這裡的預設值,因為它是一個整數主鍵,沒有指定為 false。我確實嘗試添加 autoincrement=True
以防萬一,但是當我嘗試遷移它時,alembic 告訴我沒有檢測到任何更改。
P粉6210339282024-03-22 13:25:49
從評論到問題:
不,這確實是它的工作原理。具體來說,對於像這樣的模型
class Account(Base): __tablename__ = "account" account_number = Column(Integer, primary_key=True) customer_name = Column(String(50))
alembic 修訂版 --autogenerate
將產生
def upgrade(): # ### commands auto generated by Alembic - please adjust! ### op.create_table('account', sa.Column('account_number', sa.Integer(), nullable=False), sa.Column('customer_name', sa.String(length=50), nullable=True), sa.PrimaryKeyConstraint('account_number') )
(沒有明確指定 autoincrement=
)但是當 alembic 升級 head
取得 SQLAlchemy 來實際建立 SQLAlchemy 發出的表格
CREATE TABLE account ( account_number INTEGER NOT NULL AUTO_INCREMENT, customer_name VARCHAR(50), PRIMARY KEY (account_number) )
沒有。如上所示,首次建立表格時,Alembic 會正確處理 AUTO_INCRMENT
。它沒有檢測到的是,具有現有表的 ORM 模型的列從 autoincrement=False
更改為 autoincrement=True
(反之亦然)。
這是已知行為,如提交訊息此處所示: p>
「請注意,此標誌不支援更改列的「自動增量」狀態,因為這不可跨後端移植。」
MySQL確實支援透過ALTER_TABLE更改列的AUTO_INCRMENT屬性,因此我們可以透過更改「空」upgrade
方法來實現
def upgrade(): # ### commands auto generated by Alembic - please adjust! ### pass # ### end Alembic commands ###
至
def upgrade(): op.alter_column( 'account', 'account_number', existing_type=sa.Integer(), existing_nullable=False, autoincrement=True )
渲染
ALTER TABLE account MODIFY account_number INTEGER NOT NULL AUTO_INCREMENT