neo4j-python-migrations
It is a database migration tool for Neo4j written in Python that allows to apply not only Cypher migrations, but also arbitrary Python-based migrations.
This tool is inspired by Michael Simons tool for Java and works directly on neo4j-python-driver.
Features
- Python migration support makes it possible to do any things in your migration that Python allows you to do.
- Cypher-based migrations support.
- It can be used either via the command line or directly in your code.
- Multi-database support for Neo4j Enterprise Edition users.
- The ability to separate logically independent migration chains within a single database (see the
projectoption). May be useful for Neo4j Community Edition users.
Installation
From PyPi:
pip3 install neo4j-python-migrations
Usage
Creating migrations
Naming Convention
Each migration will be a Cypher or Python file following the format V<sem_ver>__<migration_name>.ext.
Make sure to follow the naming convention as stated in Michael's tool documentation (except that .py files are allowed).
Cypher
Just create a Cypher file with your custom script, for example ./migrations/V0001__initial.cypher:
CREATE CONSTRAINT UniqueAuthor IF NOT EXISTS FOR (a:AUTHOR) REQUIRE a.uuid IS UNIQUE;
CREATE INDEX author_uuid_index IF NOT EXISTS FOR (a:AUTHOR) ON (a.uuid);
This script will be executed within a single transaction. Therefore, if you need both DDL and DML commands, split them into different files.
Python
Python-based migrations should have a special format, for example ./migrations/V0002__drop_index.py:
from neo4j import Transaction
# This function must be present
def up(tx: Transaction):
tx.run("DROP CONSTRAINT UniqueAuthor")
Applying migrations
CLI
You can apply migrations or verify the status of migrations using the command line interface:
Usage: python -m neo4j_python_migrations [OPTIONS] COMMAND [ARGS]...
Options:
--username TEXT The login of the user connecting to the
database. [env var: NEO4J_MIGRATIONS_USER;
default: neo4j]
--password TEXT The password of the user connecting to the
database. [env var: NEO4J_MIGRATIONS_PASS;
default: neo4j]
--path PATH The path to the directory for scanning
migration files. [env var:
NEO4J_MIGRATIONS_PATH; required]
--port INTEGER Port for connecting to the database [env
var: NEO4J_MIGRATIONS_PORT; default: 7687]
--host TEXT Host for connecting to the database [env
var: NEO4J_MIGRATIONS_HOST; default:
127.0.0.1]
--scheme TEXT Scheme for connecting to the database
[default: neo4j]
--project TEXT The name of the project for separating
logically independent migration chains
within a single database. [env var:
NEO4J_MIGRATIONS_PROJECT]
--schema-database TEXT The database that should be used for storing
information about migrations (Neo4j EE). If
not specified, then the database that should
be migrated is used. [env var:
NEO4J_MIGRATIONS_SCHEMA_DATABASE]
--database TEXT The database that should be migrated (Neo4j
EE) [env var: NEO4J_MIGRATIONS_DATABASE]
--install-completion [bash|zsh|fish|powershell|pwsh]
Install completion for the specified shell.
--show-completion [bash|zsh|fish|powershell|pwsh]
Show completion for the specified shell, to
copy it or customize the installation.
--help Show this message and exit.
Commands:
analyze Analyze migrations, find pending and missed.
migrate Retrieves all pending migrations, verify and applies them.
So, to apply migrations, just run the command:
python3 -m neo4j_python_migrations --username neo4j --password test --path ./migrations migrate
Note: it is more secure to store the password in the environment variable NEO4J_MIGRATIONS_PASS.
Python Code
You can apply migrations directly into your application:
from pathlib import Path
from neo4j import GraphDatabase
from neo4j_python_migrations.executor import Executor
with GraphDatabase.driver("neo4j://localhost:7687", auth=("neo4j", "test")) as driver:
executor = Executor(driver, migrations_path=Path("./migrations"))
executor.migrate()
Available methods: migrate, analyze.
How migrations are tracked
Information about the applied migrations is stored in the database using the schema described in Michael's README.
Supported migration types: СYPHER, PYTHON. Other types of migrations, such as JAVA, are not supported.
Note: the project option are incompatible with this schema.
When using the option, each migration nodes will have an additional property named project.
Release files for neo4j-python-migrations 0.1.5
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| neo4j_python_migrations-0.1.5.tar.gz | 10.3 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| neo4j_python_migrations-0.1.5-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 22.9 kB
Release files / neo4j_python_migrations-0.1.5.tar.gz
| Download URL | neo4j_python_migrations-0.1.5.tar.gz |
|---|---|
| Size | 10.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
997df9ebae12cdacbf04a3f11bc31c14ae1c5bd71e384bd3cab76456724d9198
|
|
BLAKE2b-256 checksum How to use checksums |
90fd1e01c4c1210df89198fb2a958c7ce8ae0e6e14fa5c69b6672fc36f4543a5
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.9.10 {"installer":{"name":"uv","version":"0.9.10"},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|
Release files / neo4j_python_migrations-0.1.5-py3-none-any.whl
| Download URL | neo4j_python_migrations-0.1.5-py3-none-any.whl |
|---|---|
| Size | 12.5 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
270667a2ab4d83a23c039627aa98976332c1e8ea0d509633772131c34882719a
|
|
BLAKE2b-256 checksum How to use checksums |
fc0483101d717f0f795f3bcef0802e290bfaf04f70428e362adb3e24024b37bb
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.9.10 {"installer":{"name":"uv","version":"0.9.10"},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|