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

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

4b9b3361

Ответ 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>