Stay organized with collectionsSave and categorize content based on your preferences.
This page describes how to manage Spanner database schema changes
withLiquibasefor GoogleSQL-dialect databases and PostgreSQL-dialect databases.
Liquibase is an open-source database-independent library for tracking, managing,
and applying database schema changes. It supports SQL as well as declarative
formats such as XML, YAML, and JSON.
Liquibase can target Spanner databases. It supports all
Spanner features, with some limitations.
To see additional information for PostgreSQL-dialect databases, such as Liquibase
requirements, supported change types, and limitations, seePGAdapter and Liquibase.
Install Liquibase
To use Liquibase with GoogleSQL-dialect databases, you have to install the
Spanner Liquibase extension. For PostgreSQL-dialect databases, Liquibase can use
its built-in PostgreSQL support in conjunction withPGAdapter.
GoogleSQL
Follow the instructions in theLiquibase documentationto install and configure Liquibase, and to take a snapshot of your database.
Navigate to the Spanner Liquibase Extension releases page
on GitHub and select thelatest release.
Select and download the JAR file with the nameliquibase-spanner-x.y.z-all.jar, where x.y.z represents the extension
version number. For example,liquibase-spanner-4.17.0-all.jar.
Place the downloaded JAR file in the Liquibase lib directory. The JAR
file includes the extension, the Spanner SDK, and the
Spanner JDBC driver driver.
In theliquibase.propertiesconfiguration file, set theurlproperty as
follows.
Yourliquibase.propertiesconfiguration file can contain only this
property. Other properties are optional.
Theurlstring must includeoptions=-c%20spanner.ddl_transaction_mode=AutocommitExplicitTransactionbecause Spanner doesn't support DDL transactions, and this
ensures that DDL transactions are converted to DDL batches. For more
information, seeDDL Options for PGAdapter.
Review the Liquibase samples
GoogleSQL
The sample change log filechangelog.yamlincluded with
the GoogleSQL Liquibase extension demonstrates many of the
features of Liquibase and how to use them with Spanner.
PostgreSQL
The sample change log filedbchangelog.xmlavailable in thePGAdapter and Liquibase GitHub repositorydemonstrates many of the features of Liquibase and how to use them with
Spanner.
Liquibase quickstart
This quickstart shows you how to use Liquibase to add aSingerstable to a
database.
Before you begin
Make sure that you have completed the preceding steps toinstallLiquibase.
Create a Spanner instance.
Create a GoogleSQL-dialect database or PostgreSQL-dialect database.
For PostgreSQL-dialect databases only, ensure that PGAdapter is started and running
on the same machine as your Liquibase installation. For more information, seeStart PGAdapter.
For PostgreSQL-dialect databases only, use thecreate_database_change_log.sqlscript to create thedatabasechangeloglockanddatabasechangelogmetadata
tables. You must create these tables to override the tables that Liquibase
creates automatically in your database. This is to ensure that the correct
PostgreSQL data types for Spanner are used in these
tables.
You can run the script with the following command:
This YAML defines a table calledSingerswith a primary keySingerIdand a
column calledNameto store the singer's name.
For PostgreSQL-dialect databases, we recommend using all lower case for table and column
names. For more information, seePostgreSQL case sensitivity.
Note that thecreateTablechange set must include a primary key constraint,
and the name of the primary key constraint must be pk_table_name.
Save your changes aschangelog.yaml.
Run Liquibase
Apply the changeset inchangelog.yamlby executing the following command:
liquibase --changeLogFile changelog.yaml update
Liquibase uses the URL that you defined in theliquibase.propertiesfile. You
can override the value in the file by adding the following argument to the
preceding command:
--urlURL
Verify your changes
The updates in the preceding step caused theSingertable to be added to your
database. Also, theDATABASECHANGELOGandDATABASECHANGELOGLOCKtables were
added (GoogleSQL-dialect database) or updated (PostgreSQL-dialect database).
You can verify the existence of these tables through the Google Cloud console
or gcloud CLI. For example, running the SQL querySELECT * FROM
INFORMATION_SCHEMA.TABLESreturns a list of all tables in your database.
gcloud spanner databases execute-sqlDATABASE_NAME--instance=INSTANCE\
--sql='SELECT * FROM INFORMATION_SCHEMA.TABLES'
You can see a record of the changes that were applied by querying the contents
ofDATABASECHANGELOG.
[[["Easy to understand","easyToUnderstand","thumb-up"],["Solved my problem","solvedMyProblem","thumb-up"],["Other","otherUp","thumb-up"]],[["Hard to understand","hardToUnderstand","thumb-down"],["Incorrect information or sample code","incorrectInformationOrSampleCode","thumb-down"],["Missing the information/samples I need","missingTheInformationSamplesINeed","thumb-down"],["Other","otherDown","thumb-down"]],["Last updated 2025-09-04 UTC."],[],[],null,["# Integrate Spanner with Liquibase\n\nThis page describes how to manage Spanner database schema changes\nwith [Liquibase](https://www.liquibase.org/) for GoogleSQL-dialect databases and PostgreSQL-dialect databases.\n\nLiquibase is an open-source database-independent library for tracking, managing,\nand applying database schema changes. It supports SQL as well as declarative\nformats such as XML, YAML, and JSON.\n\nLiquibase can target Spanner databases. It supports all\nSpanner features, with some limitations.\n\n- To see general limitations, see [limitations](https://github.com/cloudspannerecosystem/liquibase-spanner/blob/master/limitations.md).\n- To see additional information for PostgreSQL-dialect databases, such as Liquibase requirements, supported change types, and limitations, see [PGAdapter and Liquibase](https://github.com/GoogleCloudPlatform/pgadapter/blob/-/samples/java/liquibase).\n\nInstall Liquibase\n-----------------\n\nTo use Liquibase with GoogleSQL-dialect databases, you have to install the\nSpanner Liquibase extension. For PostgreSQL-dialect databases, Liquibase can use\nits built-in PostgreSQL support in conjunction with\n[PGAdapter](/spanner/docs/pgadapter). \n\n### GoogleSQL\n\n1. Follow the instructions in the [Liquibase documentation](https://www.liquibase.org/get-started/quickstart) to install and configure Liquibase, and to take a snapshot of your database. In the `liquibase.properties` configuration file, set the `url` property as follows.\n\n```\n jdbc:cloudspanner:/projects/PROJECT/instances/INSTANCE/databases/DATABASE\n \n``` \n\n Your `liquibase.properties` configuration file can contain only this\n property. Other properties are optional.\n\n1. Navigate to the Spanner Liquibase Extension releases page\n on GitHub and select the [latest release](https://github.com/cloudspannerecosystem/liquibase-spanner/releases/latest).\n\n2. Select and download the JAR file with the name\n `liquibase-spanner-x.y.z-all.jar`, where x.y.z represents the extension\n version number. For example, `liquibase-spanner-4.17.0-all.jar`.\n\n3. Place the downloaded JAR file in the Liquibase lib directory. The JAR\n file includes the extension, the Spanner SDK, and the\n Spanner JDBC driver driver.\n\n### PostgreSQL\n\n1. Ensure that PGAdapter is started and running on the machine\n where you install Liquibase. For more information, see [Start\n PGAdapter](/spanner/docs/pgadapter-start).\n\n2. Follow the instructions in the [Liquibase documentation](https://www.liquibase.org/get-started/quickstart)\n to install and configure Liquibase, and to take a snapshot of your database.\n\nIn the `liquibase.properties` configuration file, set the `url` property as\nfollows. \n\n```\n jdbc:postgresql://localhost:5432/DATABASE_NAME?options=-c%20spanner.ddl_transaction_mode=AutocommitExplicitTransaction\n \n```\n\nYour `liquibase.properties` configuration file can contain only this\nproperty. Other properties are optional.\n\nThe `url` string must include\n`options=-c%20spanner.ddl_transaction_mode=AutocommitExplicitTransaction`\nbecause Spanner doesn't support DDL transactions, and this\nensures that DDL transactions are converted to DDL batches. For more\ninformation, see [DDL Options for PGAdapter](https://github.com/GoogleCloudPlatform/pgadapter/blob/-/docs/ddl.md).\n\nReview the Liquibase samples\n----------------------------\n\n### GoogleSQL\n\nThe sample change log file [changelog.yaml](https://github.com/cloudspannerecosystem/liquibase-spanner/blob/master/example/changelog.yaml) included with\nthe GoogleSQL Liquibase extension demonstrates many of the\nfeatures of Liquibase and how to use them with Spanner.\n\n### PostgreSQL\n\nThe sample change log file `dbchangelog.xml` available in the\n[PGAdapter and Liquibase GitHub repository](https://github.com/GoogleCloudPlatform/pgadapter/blob/-/samples/java/liquibase)\ndemonstrates many of the features of Liquibase and how to use them with\nSpanner.\n\nLiquibase quickstart\n--------------------\n\nThis quickstart shows you how to use Liquibase to add a `Singers` table to a\ndatabase.\n\n### Before you begin\n\n- Make sure that you have completed the preceding steps to [install](#install-liq)\n Liquibase.\n\n- Create a Spanner instance.\n\n- Create a GoogleSQL-dialect database or PostgreSQL-dialect database.\n\n- For PostgreSQL-dialect databases only, ensure that PGAdapter is started and running\n on the same machine as your Liquibase installation. For more information, see\n [Start PGAdapter](/spanner/docs/pgadapter-start).\n\n- For PostgreSQL-dialect databases only, use the [create_database_change_log.sql](https://github.com/GoogleCloudPlatform/pgadapter/blob/-/samples/java/liquibase/create_database_change_log.sql)\n script to create the `databasechangeloglock` and `databasechangelog` metadata\n tables. You must create these tables to override the tables that Liquibase\n creates automatically in your database. This is to ensure that the correct\n PostgreSQL data types for Spanner are used in these\n tables.\n\n You can run the script with the following command: \n\n ```\n psql -h localhost -d DATABASE_NAME -f create_database_change_log.sql\n ```\n- Give the Spanner Liquibase extension temporary use of your\n Spanner user credentials for API access by running the\n following `gcloud` command:\n\n ```\n gcloud auth application-default login\n ```\n\n### Create a changelog.yaml\n\n1. Enter the following YAML into your favorite editor.\n\n databaseChangeLog:\n - preConditions:\n onFail: HALT\n onError: HALT\n\n - changeSet:\n id: create-singers-table\n author: spanner-examples\n changes:\n - createTable:\n tableName: Singers\n columns:\n - column:\n name: SingerId\n type: BIGINT\n constraints:\n primaryKey: true\n primaryKeyName: pk_Singers\n - column:\n name: Name\n type: VARCHAR(255)\n\n This YAML defines a table called `Singers` with a primary key `SingerId` and a\n column called `Name` to store the singer's name.\n\n For PostgreSQL-dialect databases, we recommend using all lower case for table and column\n names. For more information, see\n [PostgreSQL case sensitivity](/spanner/docs/reference/postgresql/lexical#case-sensitivity).\n\n Note that the `createTable` change set must include a primary key constraint,\n and the name of the primary key constraint must be pk_\u003cvar translate=\"no\"\u003etable_name\u003c/var\u003e.\n2. Save your changes as `changelog.yaml`.\n\n### Run Liquibase\n\nApply the changeset in `changelog.yaml` by executing the following command: \n\n```\nliquibase --changeLogFile changelog.yaml update\n```\n\nLiquibase uses the URL that you defined in the `liquibase.properties` file. You\ncan override the value in the file by adding the following argument to the\npreceding command: \n\n```\n--url URL\n```\n\n### Verify your changes\n\nThe updates in the preceding step caused the `Singer` table to be added to your\ndatabase. Also, the `DATABASECHANGELOG` and `DATABASECHANGELOGLOCK` tables were\nadded (GoogleSQL-dialect database) or updated (PostgreSQL-dialect database).\n\nYou can verify the existence of these tables through the Google Cloud console\nor gcloud CLI. For example, running the SQL query `SELECT * FROM\nINFORMATION_SCHEMA.TABLES` returns a list of all tables in your database. \n\n```\ngcloud spanner databases execute-sql DATABASE_NAME --instance=INSTANCE \\\n --sql='SELECT * FROM INFORMATION_SCHEMA.TABLES'\n```\n\nYou can see a record of the changes that were applied by querying the contents\nof `DATABASECHANGELOG`.\n\nWhat's next\n-----------\n\n- For more documentation, visit the [Spanner Liquibase Extension](https://github.com/cloudspannerecosystem/liquibase-spanner)\n GitHub repository.\n\n- To learn more about Liquibase, see [Getting Started with Liquibase](https://www.liquibase.org/get-started)."]]