Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

SqlAlchemy TIMESTAMP 'sedang diperbarui' ekstra

Rupanya masalahnya tidak terkait dengan SqlAlchemy tetapi dengan mesin MySQL yang mendasarinya. Perilaku default adalah menyetel on update CURRENT_TIMESTAMP pada kolom TIMESTAMP pertama dalam sebuah tabel.

Perilaku ini dijelaskan di sini . Sejauh yang saya mengerti, solusi yang mungkin adalah memulai MySQL dengan --explicit_defaults_for_timestamp=FALSE bendera. Solusi lain dapat ditemukan di sini . Saya belum mencoba salah satu solusi, saya akan memperbarui jawaban ini segera setelah saya menyelesaikan masalah.

EDIT:Saya mencoba metode kedua dan itu tidak terlalu berguna tetapi berhasil. Dalam kasus saya, saya membuat satu set tabel yang tidak memiliki created_at atribut dan kemudian saya telah mengubah semua tabel yang tersisa seperti yang dijelaskan pada tautan di atas.

Sesuatu di sepanjang baris:

_no_alter = set(['tables', 'which', 'do not', 'have', 'a created_at', 'column'])
Base.metadata.create_all(engine)
for table in Base.metadata.tables.keys():
    if table not in _no_alter:
      engine.execute(text('ALTER TABLE {} MODIFY created_at TIMESTAMP NOT NULL DEFAULT 0'.format(table)))

EDIT2:cara lain (lebih mudah) untuk mencapai ini adalah dengan mengatur di SqlAlchemy a server_default nilai untuk kolom:

created_at = Column(TIMESTAMP, default=datetime.utcnow, nullable=False, server_default=text('0'))


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. tabel mySQL ERROR 1064

  2. SYSDATE() Contoh – MySQL

  3. Dapatkan catatan bulan ini

  4. Pencadangan jarak jauh dari database MySQL

  5. Codeigniter/PHP memeriksa apakah dapat terhubung ke database