我正在尝试使用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()。请帮帮我。
谢谢,Ramya
您将要做的是使用changelog参数和定义一个"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知道不要将其解析为日期或引用它。
感谢您的回复。这很有帮助。以下是我所做的,它对我有效。
<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
如果您正在使用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函数。
下面给出了一种简单的方法
您可以简单地对MySQL使用valueDate="now()"。就像我的情况一样:
<changeSet id="emp_1" author="Me">
<insert tableName="Emp" schemaName="XYZ">
<column name="last_updated_at" valueDate="now()"></column>
</insert>
</changeset>
Liquibase+Oracle:
使用值Computed="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>
您可以使用valueNumeric来执行函数,因为它可以防止在值周围使用引号。
<column name="id" valueNumeric="uuid_generate_v4()"></column>
使用"property"标记,我不得不将dbms更改为dbms="postgresql"
,并使用PostgreSQL函数表示"value"(在我的情况下为CURRENT_TIMESTAMP
)。
在没有"property"标记的情况下,我在"column"标记中使用了valueDate="CURRENT_TIMESTAMP"
。
我使用的是PostgreSQL 9.1.9和Liquibase 2.0.5。
首先必须在insert标记中设置dbms。
对于日期,请使用列标记中的valueDate字段。
<changeSet author="name" id="id_1">
<insert tableName="table_name" dbms="oracle">
<column name="id" value="71"/>
<column name="description" value="test"/>
<column name="start_date" valueDate="2020-01-01"/>
<column name="end_date" valueDate="2021-01-01"/>
</insert>
</changeSet>
下面的解决方案适用于mysql DB。
<column name="LAST_MODIFIED_DATE" valueComputed="CURRENT_TIMESTAMP"/>
Neek的答案很好(尽管我必须使用valueComputed
),但是,在代码的其他部分(如单元测试)中进行替换可能会出现问题,因此根据Liquidbase文档,以下方法有效:
<insert tableName="Emp" schemaName="XYZ" dbms="oracle">
<column name="profile_last_update" value="sysdate"/>
</insert>
<insert tableName="Emp" schemaName="XYZ" dbms="postgresql, mysql">
<column name="profile_last_update" value="now()"/>
</insert>