Anda tidak dapat menambahkan kolom ke tabel Anda dengan data di dalamnya semua dalam satu langkah. Anda harus menggunakan setidaknya dua pernyataan terpisah untuk melakukan DDL terlebih dahulu (ALTER TABLE
) dan detik DML (UPDATE
atau INSERT ... ON DUPLICATE KEY UPDATE
).
Ini berarti menambahkan kolom dengan NOT NULL
kendala memerlukan tiga langkah:
- Tambahkan kolom nullable
- Mengisi kolom dengan nilai di setiap baris
- Tambahkan
NOT NULL
kendala pada kolom
Atau, dengan menggunakan nilai default "dummy", Anda dapat melakukannya dalam dua langkah (berhati-hatilah untuk tidak membiarkan nilai "dummy" mengambang, atau gunakan nilai yang bermakna/terdokumentasi dengan baik):
- Tambahkan kolom sebagai
NOT NULL DEFAULT ''
(atau gunakan mis.0
untuk tipe numerik) - Mengisi kolom dengan nilai di setiap baris
Anda juga dapat mengubah tabel lagi untuk menghapus DEFAULT
nilai. Secara pribadi, saya lebih suka metode pertama karena tidak memasukkan nilai-nilai yang tidak berarti ke dalam tabel Anda dan kemungkinan besar akan menimbulkan kesalahan jika langkah kedua bermasalah. Saya mungkin gunakan metode kedua ketika kolom cocok untuk DEFAULT
alami tertentu value dan saya berencana untuk menyimpannya dalam definisi tabel final.
Selain itu, Anda tidak membuat parameter kueri dengan benar; anda harus meneruskan nilai parameter ke metode daripada memformat argumen string di dalam pemanggilan metode. Dengan kata lain:
cursor.execute("Query with %s, %s, ...", iterable_with_values) # Do this!
cursor.execute("Query with %s, %s, ..." % iterable_with_values) # NOT this!