Значение столбца по умолчанию сохраняется в таблице - PullRequest
8 голосов
/ 18 марта 2011

В настоящее время я использую Column со следующей подписью:

Column('my_column', DateTime, default=datetime.datetime.utcnow)

Я пытаюсь выяснить, как это изменить, чтобы можно было использовать ванильsql вставляет (INSERT INTO ...), а не через sqlalchemy.В основном я хочу знать, как сохранить значение по умолчанию для таблицы, не теряя при этом этой функции установки столбца в текущее время utc.

База данных, которую я использую, - это PostgreSQL.

Ответы [ 2 ]

16 голосов
/ 19 марта 2011

Есть несколько способов, чтобы SQLAlchemy определял, как значение должно быть установлено при вставке / обновлении. Вы можете просмотреть их в документации .

То, как вы делаете это сейчас (определяя аргумент default для столбца), будет влиять только тогда, когда SQLAlchemy генерирует операторы вставки. В этом случае он вызовет вызываемую функцию (в вашем случае - функцию datetime.datetime.utcnow) и будет использовать это значение.

Однако, если вы собираетесь запускать прямой код SQL, эта функция никогда не будет запущена, поскольку вы вообще обойдете SQLAlchemy.

То, что вы, вероятно, хотите сделать, это использовать Способность по умолчанию на стороне сервера SQLAlchemy.

Попробуйте вместо этого код:

from sqlalchemy.sql import func
...
Column('my_column', DateTime, server_default=func.current_timestamp())

SQLAlchemy теперь должен сгенерировать таблицу, которая заставит базу данных автоматически вставить текущую дату в столбец my_column. Причина, по которой это работает, заключается в том, что теперь используется значение по умолчанию на стороне database , поэтому вам больше не нужен SQLAlchemy для использования по умолчанию.

Примечание : Я думаю, что это фактически вставит местное время (в отличие от UTC). Надеюсь, что все остальное можно выяснить отсюда.

2 голосов
/ 25 октября 2013

Если вы хотите ввести время UTC, вам нужно будет сделать что-то вроде этого:

from sqlalchemy import text
...
created = Column(DateTime,
                 server_default=text("(now() at time zone 'utc')"),
                 nullable=False)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...