Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Dodatek SqlAlchemy TIMESTAMP „przy aktualizacji”

Najwyraźniej problem nie jest związany z SqlAlchemy, ale z bazowym silnikiem MySQL. Domyślnym zachowaniem jest ustawienie on update CURRENT_TIMESTAMP w pierwszej kolumnie TIMESTAMP w tabeli.

To zachowanie opisano tutaj . O ile rozumiem, możliwym rozwiązaniem jest uruchomienie MySQL z --explicit_defaults_for_timestamp=FALSE flaga. Inne rozwiązanie znajdziesz tutaj . Nie wypróbowałem jeszcze żadnego rozwiązania, zaktualizuję tę odpowiedź, gdy tylko rozwiążę problem.

EDYCJA:Wypróbowałem drugą metodę i nie jest ona zbyt poręczna, ale działa. W moim przypadku stworzyłem zestaw tabel, które nie mają created_at atrybut, a następnie zmieniłem wszystkie pozostałe tabele zgodnie z opisem w powyższym linku.

Coś w stylu:

_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:innym (łatwiejszym) sposobem osiągnięcia tego jest ustawienie w SqlAlchemy server_default wartość kolumny:

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. czy mój duży stół mysql jest skazany na awarię?

  2. Jak wyświetlić wartości wierszy jako kolumny w MySQL?

  3. Suma na lewym sprzężeniu SQL

  4. walidacja formularza ajax za pomocą mysqli_query

  5. SQL Wstaw do tabeli nowe wiersze dla każdego pola w tej samej tabeli