Подтвердить что ты не робот

Как установить DEFAULT ON UPDATE CURRENT_TIMESTAMP в mysql с sqlalchemy?

Я создаю таблицу с sqlalchemy.

user = Table('users', Metadata,
Column('datecreated', TIMESTAMP,                                  
            server_default=text('CURRENT_TIMESTAMP')),            
Column('datemodified', TIMESTAMP,                                 
               server_onupdate=text('CURRENT_TIMESTAMP')),
)

Но это не приведет к установке DEFAULT ON UPDATE CURRENT_TIMESTAMP.

Я проверяю эту ссылку, Как вы получаете SQLAlchemy для переопределения MySQL "при обновлении CURRENT_TIMESTAMP" , но для букв мне потребуется связать это с определением таблицы.

спасибо заранее:)

4b9b3361

Ответ 1

Если вы используете MySQL 5.6 или более позднюю версию, прокрутите вниз для получения соответствующего ответа. Пользователи более старых версий, пожалуйста, прочтите это.


До MySQL 5.6. в одной таблице вы можете иметь только один "автоматический" столбец TIMESTAMP.

От: http://dev.mysql.com/doc/refman/5.5/en/timestamp.html

Для одного столбца TIMESTAMP в таблице вы можете назначить текущий timestamp в качестве значения по умолчанию и значения автоматического обновления. это возможно, чтобы текущая временная метка была значением по умолчанию для инициализация столбца, значение автоматического обновления или и то, и другое. Это не возможно, чтобы текущая временная метка была значением по умолчанию для одного столбец и значение автоматического обновления для другого столбца.

Ответ 2

Вы можете захватить server_default, чтобы установить также ON UPDATE:

Column('datemodified', TIMESTAMP,
       server_default=text('CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP'))

Это генерирует следующую запись столбца:

datemodified TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP

Однако ответ Mchl по-прежнему применяется: в таблице может быть только один автоматический столбец TIMESTAMP (http://dev.mysql.com/doc/refman/5.5/en/timestamp.html)

Также обратите внимание, что порядок столбцов имеет важное значение! Если у вас есть столбец TIMESTAMP без модификаторов DEFAULT и ON UPDATE, и это первый столбец TIMESTAMP в вашей таблице, он автоматически будет установлен в значение DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP. (http://dev.mysql.com/doc/refman/5.5/en/timestamp.html)

Итак, это прекрасно:

Column('datemodified', TIMESTAMP,
       server_default=text('CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP'))
Column('datecreated', TIMESTAMP)

пока это не так:

Column('datecreated', TIMESTAMP)
Column('datemodified', TIMESTAMP,
       server_default=text('CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP'))

Чтобы установить "datecreated" в текущее время во время первой записи строки, просто установите его значение явно в NULL. Опять же, http://dev.mysql.com/doc/refman/5.5/en/timestamp.html:

По умолчанию столбцы TIMESTAMP не являются NULL, не могут содержать NULL значения и назначение NULL назначает текущую временную метку.

Ответ 3

Column('datemodified',
       TIMESTAMP,                                 
       server_onupdate=text(
           ' ON UPDATE '.join([str(func.current_timestamp())] * 2)))

Таким образом вы используете внутреннюю функцию SQLAlchemy func.current_timestamp().

Ответ 4

Если все, что вам нужно, это DEFAULT CURRENT_TIMESTAMP при обновлении CURRENT_TIMESTAMP в MySQL, то просто установка столбца TIMESTAMP в sqlalchemy, чтобы он не обнулялся, работает

Column(TIMESTAMP, nullable=False)

Ответ 5

Это работало на Mysql 8

sa.Column('created_at', sa.TIMESTAMP, server_default=func.now()),
sa.Column('updated_at', sa.TIMESTAMP, server_default=text('CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP'))

По какой-то причине опции server_onupdate не работали.