Rumah  >  Soal Jawab  >  teks badan

Alembic - Menggunakan kunci utama komposit menyebabkan takrif jadual yang salah dalam MySQL

<p>Saya mempunyai berbilang model SQLAlchemy pangkalan data "berversi" yang menggunakan kunci utama komposit, dicapai dengan menggabungkan medan integer ("id") penambahan automatik dan medan datetime ("record_valid_from"). Saya cuba menjalankan model ini dalam bekas Docker tempatan terhadap pangkalan data MySQL. </p><p>Takrifan model adalah lebih kurang seperti berikut:</p><p><br /></p> <pre class="brush:php;toolbar:false;">dari import sqlalchemy.orm (DeclarativeBase, Mapped) kelas kelasA(DeclarativeBase): id: Mapped[int] = mapped_column(primary_key=True, index=True, autoincrement=True) record_valid_from: Mapped[datetime] = mapped_column(DateTime, primary_key=Benar, default=get_current_timestamp # ini ialah kaedah python yang mengembalikan datetime.now() ) aktif: Mapped[bool] = mapped_column(Boolean, default=True, comment="TRUE jika versi terkini, FALSE sebaliknya" ) ... # beberapa lagi medan dan logik</pre> <p>Model lain kelihatan serupa, dengan pelbagai hubungan antara mereka. </p><p>Apabila menggunakan Alembic untuk menjana skrip migrasi secara automatik (semakan alembic --autogenerate -m "pangkalan data init"), kod Python yang dijana kelihatan menghasilkan pernyataan SQL yang tidak sah. </p><p>Secara lebih khusus, saya temui: </p><p><br /></p> <pre class="brush:php;toolbar:false;">(pymysql.err.OperationalError) (1075, 'Takrif jadual yang salah; hanya boleh ada satu lajur auto dan ia mesti ditakrifkan sebagai kunci')< ;/pra> <p>Berikut ialah kod migrasi (nota: Saya telah memudahkannya): </p> <pre class="brush:php;toolbar:false;">def upgrade() -> op.create_table('classA', sa.Column('name', sa.String(panjang=100), nullable=False), sa.Column('record_valid_from', sa.DateTime(), nullable=False), sa.Column('active', sa.Boolean(), nullable=False), sa.Column('id', sa.Integer(), autoincrement=True, nullable=False), sa.PrimaryKeyConstraint('record_valid_from', 'id') ) op.create_index(op.f('ix_classA_id'), 'classA', ['id'], unique=False)</pre> <p>Adakah sesiapa mengalami situasi yang sama? Atau tahu bagaimana untuk menyelesaikan masalah ini? </p><p>Saya mencuba yang berikut: </p><p><br /></p> <ul> <li>Panggil op.create_primary_key selepas membuat jadual (lihat: https://alembic.sqlalchemy.org/en/latest/ops.html#alembic.operations.Operations.create_primary_key). Keputusan: sqlalchemy.exc.OperationalError: (pymysql.err.OperationalError) (1068, 'Berbilang kunci utama ditakrifkan').<kod></code></li> <li>Alih keluar sa.PrimaryKeyConstraint dan panggil terus op.create_primary_key. keputusan: <ul> <li>Penghijrahan telah berjaya dan berjalan seperti biasa. </li> <li>Percubaan untuk mencipta model ORM baharu mengakibatkan ralat berikut: sqlalchemy.exc.OperationalError: (pymysql.err.OperationalError) (1364, "Field 'id' tidak mempunyai nilai lalai"). <kod></code></li> </ul> </li> </ul><p><br /></p>
P粉183077097P粉183077097428 hari yang lalu558

membalas semua(1)saya akan balas

  • P粉921165181

    P粉9211651812023-07-25 14:49:14

    Saya menghabiskan beberapa jam untuk isu ini dan membetulkannya sendiri. Bagi sesiapa yang mempunyai masalah yang sama, berikut ialah jawapannya:

    Sebenarnya, susunan medan kunci utama dalam PrimaryKeyConstraint mempunyai kesan. Masalah saya telah diselesaikan dengan menukar susunan, dan bukannya menggunakan sa.PrimaryKeyConstraint('record_valid_from', 'id'), saya menukar kepada sa.PrimaryKeyConstraint("id", "record_valid_from").

    Semoga ini membantu.


    balas
    0
  • Batalbalas