cari

Rumah  >  Soal Jawab  >  teks badan

Tidak dapat autoincrement SQLAlchemy dalam MySQL

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.

P粉899950720P粉899950720321 hari yang lalu422

membalas semua(1)saya akan balas

  • P粉621033928

    P粉6210339282024-03-22 13:25:49

    Dari komen kepada soalan:

    Tidak, ini adalah cara ia berfungsi. Khususnya, untuk model seperti ini

    class Account(Base):
        __tablename__ = "account"
        account_number = Column(Integer, primary_key=True)
        customer_name = Column(String(50))
    

    alembic 修订版 --autogenerate akan menjana

    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')
        )
    

    (tanpa menyatakan secara eksplisit autoincrement=)但是当 alembic 升级 head Dapatkan SQLAlchemy untuk benar-benar mencipta jadual yang SQLAlchemy keluarkan

    CREATE TABLE account (
            account_number INTEGER NOT NULL AUTO_INCREMENT, 
            customer_name VARCHAR(50), 
            PRIMARY KEY (account_number)
    )
    

    Tidak. 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 :

    "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" upgrade

    def upgrade():
        # ### commands auto generated by Alembic - please adjust! ###
        pass
        # ### end Alembic commands ###
    

    kepada

    def upgrade():
        op.alter_column(
            'account',
            'account_number',
            existing_type=sa.Integer(),
            existing_nullable=False,
            autoincrement=True
        )
    

    Rendering

    ALTER TABLE account MODIFY account_number INTEGER NOT NULL AUTO_INCREMENT
    

    balas
    0
  • Batalbalas