首頁  >  問答  >  主體

無法自動增加的MySQL中的SQLAlchemy

我正在使用 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粉899950720P粉899950720211 天前266

全部回覆(1)我來回復

  • P粉621033928

    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 (反之亦然)。

    這是已知行為,如提交訊息此處所示:

    「請注意,此標誌支援更改列的「自動增量」狀態,因為這不可跨後端移植。」

    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
    

    回覆
    0
  • 取消回覆