What is Liquibase
<<TODO>>
Why Liquibase
<<TODO>>
Liquibase Setup
1] To experiment with liquibase, you need a db instance running. Configure it using AWS - (click here for reference link)
2] Download Liquibase and add to PATH
export PATH=$PATH:/path/to/extracted/liquibase/dir
3] Create a directory to contain liquibase scripts.
Add liquibase.properties file.
driver=org.postgresql.Driver classpath=/home/sibtain/work/liquibase/postgresql-9.4.1212.jre6.jar url=jdbc:postgresql://lqbase.cfm21jixd6ei.us-east-1.rds.amazonaws.com:5432/my_db username=postgres_user password=postgres_pswd # default changelog to use, relative to classpath changeLogFile=release_1.changelog.xml
Add release_1.changelog.xml
<databasechangelog xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xsi:schemalocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.1.xsd"> <changeset author="lqbase_sibtain" id="1"> <createtable tablename="subject"> <column name="id" type="int"> <constraints nullable="false" primarykey="true"> </constraints></column> <column name="name" type="varchar(50)"> <constraints nullable="false"> </constraints></column> <column defaultvalueboolean="true" name="active" type="boolean"> </column></createtable> </changeset> </databasechangelog>
In case you have not created aws db instance, then you may need to download postgresql driver from here.
4] Execute Command
$ liquibase migrate
5] Check your database to find subject table created.
List of relations
Schema | Name | Type | Owner
--------+-----------------------+-------+---------
public | databasechangelog | table | sibtain
public | databasechangeloglock | table | sibtain
public | subject | table | sibtain
$ liquibase migrate
5] Check your database to find subject table created.
List of relations
Schema | Name | Type | Owner
--------+-----------------------+-------+---------
public | databasechangelog | table | sibtain
public | databasechangeloglock | table | sibtain
public | subject | table | sibtain
Examples
Create Employee table and add few records to it.
main.changelog.xml
create_table_employee.changelog.xml
insert_data_employee.changelog.xml
main.changelog.xml
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.1.xsd"> <include file="create_table_employee.changelog.xml" relativeToChangelogFile="true"/> <include file="insert_data_employee.changelog.xml" relativeToChangelogFile="true"/> </databaseChangeLog>
create_table_employee.changelog.xml
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.1.xsd"> <changeSet id="create_employee_table" author="sibtain"> <createTable tableName="Employee"> <column name="EmployeeId" type="BIGINT"> <constraints nullable="false"/> </column> <column name="FirstName" type="VARCHAR(50)"> <constraints nullable="true"/> </column> <column name="LastName" type="varchar(50)"> <constraints nullable="true"/> </column> <column name="Phone" type="varchar(50)"> <constraints nullable="true"/> </column> <column name="JoiningDate" type="Date"> <constraints nullable="true"/> </column> </createTable> </changeSet> <changeSet id="add_pk_for_employee" author="sibtain"> <addPrimaryKey columnNames="EmployeeId" constraintName="pk_employee" tableName="Employee" /> </changeSet> </databaseChangeLog>
insert_data_employee.changelog.xml
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.1.xsd"> <changeSet id="add_employee_data" author="sibtain"> <insert tableName="Employee"> <column name="EmployeeId" type="BIGINT" valueNumeric="101"/> <column name="FirstName">John</column> <column name="LastName">Legault</column> <column name="Phone">+91 12398283</column> <column name="JoiningDate" valueDate="2014-03-10"/> </insert> <insert tableName="Employee"> <column name="EmployeeId" type="BIGINT" valueNumeric="102"/> <column name="FirstName">Pete</column> <column name="LastName">Coyle</column> <column name="Phone">+44 12398283</column> <column name="JoiningDate" valueDate="2015-12-21"/> </insert> <insert tableName="Employee"> <column name="EmployeeId" type="BIGINT" valueNumeric="103"/> <column name="FirstName">Brian</column> <column name="LastName">Apostle</column> <column name="Phone">+20 12398283</column> <column name="JoiningDate" valueDate="2016-09-20"/> </insert> <rollback> <sql> delete from Employee where EmployeeId in (101, 102, 103) </sql> </rollback> </changeSet> </databaseChangeLog>
After doing liquibase migrate, perform select to view results in database.
my_db=> SELECT * FROM "Employee";
EmployeeId | FirstName | LastName | Phone | JoiningDate
------------+-----------+----------+--------------+-------------
101 | John | Legault | +91 12398283 | 2014-03-10
102 | Pete | Coyle | +44 12398283 | 2015-12-21
103 | Brian | Apostle | +20 12398283 | 2016-09-20
(3 rows)
my_db=> SELECT * FROM "Employee";
EmployeeId | FirstName | LastName | Phone | JoiningDate
------------+-----------+----------+--------------+-------------
101 | John | Legault | +91 12398283 | 2014-03-10
102 | Pete | Coyle | +44 12398283 | 2015-12-21
103 | Brian | Apostle | +20 12398283 | 2016-09-20
(3 rows)