無法自動增加的MySQL中的SQLAlchemy
P粉899950720
P粉899950720 2024-03-21 19:08:36
0
1
261

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

全部回覆(1)
P粉621033928

從評論到問題:

不,這確實是它的工作原理。具體來說,對於像這樣的模型

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
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!