Liquibase <insert>: Вставить текущую дату
Я пытаюсь вставить данные, используя бирку для вставки жидкости. Он отлично работает, когда я вводя число в значение tag.
Но я ищу простую функцию, которая позаботится о дате по умолчанию (текущем DateTime базы данных), даже если у меня ее нет как часть определения моей таблицы.
Например:
<changeSet id="abc_1" author="Me">
<insert tableName="Emp" schemaName="XYZ">
<column name="name" value="Me"/>
<column name="create_date" value ="1328055111692"/>
<column name="profile_last_update" value="currentDateTimeFunction"/>
<column name="group_name" value="BlahBlah"/>
</insert>
</changeSet>
здесь <column name="create_date" value ="1328055111692"/>
отлично работает и вставляется в базу данных. Я также попытался использовать <defaultValueDate>
и <valueDate>
, но они также нуждаются в некотором вводе даты в указанном формате.
Я ищу некоторую функцию типа currentDateTimeFunction, которая будет преобразована в UNIX_TIMESTAMP() или SYSDATE или now() на основе типа базы данных, которую я использую. Пожалуйста, помогите мне.
Спасибо,
Ramya
Ответы
Ответ 1
Что вам нужно будет сделать, это использовать параметр изменений и
определите параметр "now" или "current_timestamp", который заменяется на тип базы данных.
В верхней части вашего <databaseChangeLog>
, как правило, вне вашего <changeset>
, добавьте определения для каждой базы данных, например:
<property name="now" value="sysdate" dbms="oracle"/>
<property name="now" value="now()" dbms="mysql"/>
<property name="now" value="now()" dbms="postgresql"/>
то в ваших наборах изменений используйте
<column name="Join_date" defaultValueFunction="${now}"/>
Обратите внимание на использование функции defaultValueFunction, которая сообщит Liquibase
не анализировать его как дату или цитату.
Ответ 2
Спасибо за ваш ответ. это было полезно. Ниже приводится то, что я сделал, и это сработало для меня.
<property name="now" value="UNIX_TIMESTAMP()" dbms="mysql"/>
<changeSet id="emp_1" author="Me">
<insert tableName="Emp" schemaName="XYZ">
<column name="EmpName" value="abc"/>
<column name="Join_date" valueDate="${now}"/>
<column name="Profile_last_update" valueDate="${now}"/>
<column name="group_name" value="BlahBlah"/>
</insert>
</changeSet>
Еще раз спасибо,
Ramya
Ответ 3
Если вы используете DB2, вы можете сделать следующее:
<changeSet id="emp_1" author="Me">
<insert tableName="Emp" schemaName="XYZ">
<column name="EmpName" value="abc"/>
<column name="Join_date" valueDate="CURRENT TIMESTAMP"/>
<column name="Profile_last_update" valueDate="CURRENT TIMESTAMP"/>
<column name="group_name" value="BlahBlah"/>
</insert>
</changeset>
Полученный SQL-код не цитируется, поэтому он просто вызывает функцию DB2.
Ответ 4
Ответы, размещенные Рамей и Адамом Д., также работают для PostgreSQL.
Используя тег "property", мне пришлось изменить dbms на dbms="postgresql"
и использовать функцию PostgreSQL для "value" (CURRENT_TIMESTAMP
в моем случае).
Без тега "property" я использовал valueDate="CURRENT_TIMESTAMP"
в теге "column".
Я использую PostgreSQL 9.1.9 и Liquibase 2.0.5.
Ответ 5
Вы можете использовать valueNumeric для выполнения функций, так как это предотвратит обертку кавычек вокруг значения.
<column name="id" valueNumeric="uuid_generate_v4()"></column>
Ответ 6
Существует простой способ сделать это, как показано ниже
вы можете просто использовать valueDate = "now()" для MySQL. Как и в моем случае, я сделал:
<changeSet id="emp_1" author="Me">
<insert tableName="Emp" schemaName="XYZ">
<column name="last_updated_at" valueDate="now()"></column>
</insert>
</changeset>