Как установить DEFAULT ON UPDATE CURRENT_TIMESTAMP в MySQL с sqlalchemy? - PullRequest
12 голосов
/ 09 августа 2011

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

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

Ответы [ 4 ]

18 голосов
/ 24 января 2013

Вы можете захватить server_default, чтобы установить также ОБНОВЛЕНИЕ ВКЛ .:

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столбцы NOT NULL, не могут содержать значения NULL, а назначение NULL назначает текущую метку времени.

12 голосов
/ 09 августа 2011

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


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

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

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

4 голосов
/ 23 сентября 2013
Column('datemodified',
       TIMESTAMP,                                 
       server_onupdate=text(
           ' ON UPDATE '.join([str(func.current_timestamp())] * 2)))

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

0 голосов
/ 13 марта 2018

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

Column(TIMESTAMP, nullable=False)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...