alembic icon indicating copy to clipboard operation
alembic copied to clipboard

Postgres Index with opperators dont autogenerate

Open garyvdm opened this issue 3 years ago • 5 comments

Describe the bug I'm using a postgresql index with a inet_ops operator. Autogenerated code does not include the index.

Expected behavior Autogenerated code should include the index.

To Reproduce

env.py

from logging.config import fileConfig

from sqlalchemy import Column, Index, MetaData, Table, engine_from_config, literal_column
from sqlalchemy.dialects.postgresql import INET
from sqlalchemy import pool

from alembic import context

config = context.config
if config.config_file_name is not None:
    fileConfig(config.config_file_name)

target_metadata = MetaData()

Table(
    "t", target_metadata,
    Column("addr", INET),
    Index(
        "ix_1",
        literal_column("addr inet_ops"),
        postgresql_using="GiST",
    ),
)

def run_migrations_offline() -> None:
    url = config.get_main_option("sqlalchemy.url")
    context.configure(
        url=url, target_metadata=target_metadata, 
        literal_binds=True, dialect_opts={"paramstyle": "named"}
    )
    with context.begin_transaction():
        context.run_migrations()

def run_migrations_online() -> None:
    connectable = engine_from_config(
        config.get_section(config.config_ini_section),
        prefix="sqlalchemy.", poolclass=pool.NullPool,
    )
    with connectable.connect() as connection:
        context.configure(connection=connection, target_metadata=target_metadata)
        with context.begin_transaction():
            context.run_migrations()

if context.is_offline_mode():
    run_migrations_offline()
else:
    run_migrations_online()

Error

% alembic revision --autogenerate -m "Add inet ops table/index"
INFO  [alembic.runtime.migration] Context impl PostgresqlImpl.
INFO  [alembic.runtime.migration] Will assume transactional DDL.
INFO  [alembic.autogenerate.compare] Detected added table 't'
/home/gary/dev/alembic-inet-ops-mcve/ve/lib64/python3.10/site-packages/alembic/ddl/postgresql.py:252: UserWarning: autogenerate skipping functional index ix_1; not supported by SQLAlchemy reflection
  util.warn(
  Generating /home/gary/dev/alembic-inet-ops-mcve/alembic/versions/7361d9f63fd9_add_inet_ops_table_index.py ...  done

Versions.

  • OS: Fedora 36
  • Python: Python 3.10.7
  • Alembic: 1.8.1
  • SQLAlchemy: 1.4.41
  • Database: postgresql
  • DBAPI: psycopg2-binary==2.9.4

Have a nice day! P.S. pull request to follow shortly.

garyvdm avatar Oct 12 '22 11:10 garyvdm

Hi,

This is a known limitation. The issue is similar to https://github.com/sqlalchemy/alembic/issues/523 but for postgresql.

In v2 sqlalchemy implemented https://github.com/sqlalchemy/sqlalchemy/issues/7442 and will correctly reflect functional indexes, but currently alembic does not take them into consideration in auto-generate.

CaselIT avatar Oct 12 '22 12:10 CaselIT

Since SQLAlchemy 2 supports this, is there a proposed timeline for alembic autogenerate to enable functional indices?

ericvanular avatar Nov 18 '22 20:11 ericvanular

there is no proposed timeline, overall as a volunteer driven open source project we don't usually have timelines for things.

zzzeek avatar Nov 18 '22 20:11 zzzeek

That's fair, I appreciate all of your work on this ecosystem. Just trying to understand whether I should wait or look for an alternative option in the meantime

ericvanular avatar Dec 01 '22 16:12 ericvanular