Package: neo4j-python-migrations
neo4j-python-migrationsIt is a database migration tool forNeo4jwritten in Python
that allows to apply not only Cypher migrations, but also arbitrary Python-based migrations.This tool is inspired byMichael Simons tool for Javaand works directly onneo4j-python-driver.FeaturesPython 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 theprojectoption).
May be useful for Neo4j Community Edition users.InstallationFrom PyPi:pip3 install neo4j-python-migrationsIf you want to install it from sources, try this:python3 -m pip install poetry
python3 -m pip install .
python3 -m neo4j_python_migrationsUsageCreating migrationsNaming ConventionEach migration will be a Cypher or Python file following the formatV<sem_ver>__<migration_name>.ext.Make sure to follow the naming convention as stated inMichael's tool documentation(except that .py files are allowed).CypherJust create a Cypher file with your custom script, for example./migrations/V0001__initial.cypher:CREATE CONSTRAINT UniqueAuthor IF NOT EXISTS ON (a:AUTHOR) ASSERT 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.PythonPython-based migrations should have a special format, for example./migrations/V0002__drop_index.py:from neo4j import Session


# This function must be present
def up(session: Session):
    with session.begin_transaction() as tx:
        tx.run("DROP INDEX author_uuid_index")Applying migrationsCLIYou 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;
                                  required]
  --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 migrateNote: it is more secure to store the password in the environment variable NEO4J_MIGRATIONS_PASS.Python CodeYou 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 trackedInformation about the applied migrations is stored in the database using the schema
described inMichael's README.Supported migration types: СYPHER, PYTHON. Other types of migrations, such as JAVA, are not supported.Note: theprojectoption are incompatible with this schema.
When using the option, each migration nodes will have an additional property namedproject.