Mysql
 sql >> база данни >  >> RDS >> Mysql

SqlAlchemy TIMESTAMP „при актуализиране“ допълнително

Очевидно проблемът не е свързан със SqlAlchemy, а с основния MySQL двигател. Поведението по подразбиране е да се зададе on update CURRENT_TIMESTAMP в първата колона TIMESTAMP в таблица.

Това поведение е описано тук . Доколкото разбирам, възможно решение е да стартирате MySQL с --explicit_defaults_for_timestamp=FALSE знаме. Друго решение може да се намери тук . Все още не съм пробвал нито едно от решенията, ще актуализирам този отговор веднага щом разреша проблема.

РЕДАКТИРАНЕ:Опитах втория метод и не е много удобен, но работи. В моя случай създадох набор от таблици, които нямат created_at атрибут и след това промених всички останали таблици, както е описано в връзката по-горе.

Нещо от рода на:

_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:друг (по-лесен) начин да постигнете това е като зададете в SqlAlchemy server_default стойност за колоната:

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. Как да транспонирате редове в колони въз основа на интервали от време в MYSQL

  2. Regex за получаване на регионални и областни кодове от пощенски кодове на Обединеното кралство

  3. Поръчайте SQL от най-силния LIKE?

  4. Не може да се изведе подходяща mysql информация към щракната връзка, като се използва SELECT *FROM таблица WHERE променлива LIKE '$variable'

  5. Вземете ID на таблицата след вмъкване с ColdFusion и MySQL