Как установить 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" , но для букв мне потребуется связать это с определением таблицы.
спасибо заранее:)
Ответы
Ответ 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 не работали.