我正在尝试使用liquibase插入标记插入数据。当我输入一个数字到值标签时,它工作正常。 但我正在寻找一个简单的函数来处理默认日期(数据库的当前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()。请帮帮我。
谢谢你, 拉姆亚
答案 0 :(得分:51)
您需要做的是使用changelog parameter和 定义每个数据库类型替换的“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知道 不要将其解析为日期或引用它。
答案 1 :(得分:14)
感谢您的回复。这很有帮助。以下是我所做的,它对我有用。
<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>
再次感谢, 拉姆亚
答案 2 :(得分:4)
如果您使用的是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函数。
答案 3 :(得分:1)
有一种简单的方法,如下所示:
你可以简单地为MySQL使用valueDate =“now()”。就像我的情况一样:
<changeSet id="emp_1" author="Me">
<insert tableName="Emp" schemaName="XYZ">
<column name="last_updated_at" valueDate="now()"></column>
</insert>
</changeset>
答案 4 :(得分:1)
Liquibase + Oracle: 使用valueComputed =“ SYSDATE”
使用Oracle 11g:
<insert tableName="SOMETABLE">
<column name="ID" valueComputed="SOMETABLE_SEQ.NEXTVAL" />
<column name="USER_ID" value="123" />
<column name="CREATED_DATE" valueComputed="SYSDATE" />
</insert>
答案 5 :(得分:0)
Ramya和Adam D发布的答案也适用于PostgreSQL。
使用“property”标签,我不得不将dbms更改为dbms="postgresql"
并将PostgreSQL函数用于“value”(在我的情况下为CURRENT_TIMESTAMP
)。
如果没有“property”标记,我在“column”标记中使用了valueDate="CURRENT_TIMESTAMP"
。
我正在使用PostgreSQL 9.1.9和Liquibase 2.0.5。
答案 6 :(得分:0)
您可以使用valueNumeric来执行函数,因为它会阻止在值周围包装引号。
<column name="id" valueNumeric="uuid_generate_v4()"></column>