Home > OS >  Python SQLAlchemy PostgreSQL Deprecated API features
Python SQLAlchemy PostgreSQL Deprecated API features

Time:01-27

I am using following code to create the function and trigger to update the created_at and updated_at fields. with upgrade of new module getting the deprecated API warning.

How can I replace engine.execute(sa.text(create_refresh_updated_at_func.format(schema=my_schema))) line to remove the warning message?

Code:

mapper_registry.metadata.create_all(engine, checkfirst=True)

    create_refresh_updated_at_func = """
     CREATE OR REPLACE FUNCTION {schema}.refresh_updated_at()
        RETURNS TRIGGER AS $$
        BEGIN
            NEW.updated_at = NOW();
            RETURN NEW;
        END;
        $$ LANGUAGE plpgsql;
        """

    my_schema = "public"
    engine.execute(sa.text(create_refresh_updated_at_func.format(schema=my_schema)))

Warrning:

RemovedIn20Warning: Deprecated API features detected! These feature(s) are not compatible with SQLAlchemy 2.0. To prevent incompatible upgrades prior to updating applications, ensure requirements files are pinned to "sqlalchemy<2.0". Set environment variable SQLALCHEMY_WARN_20=1 to show all deprecation warnings. Set environment variable SQLALCHEMY_SILENCE_UBER_WARNING=1 to silence this message. (Background on SQLAlchemy 2.0 at: https://sqlalche.me/e/b8d9) engine.execute(sa.text(create_refresh_updated_at_func.format(schema=my_schema)))

CodePudding user response:

SQLAlchemy no longer supports autocommit at the library level. You need to run the execute within a transaction.

This should work:

with engine.begin() as conn:
   conn.execute(text(create_refresh_updated_at_func.format(schema=my_schema)))

migration-core-connection-transaction

You could also use the driver-level isolation level like this but I think the connections from this pool will all be set to autocommit:

engine2 = create_engine(f"postgresql psycopg2://{username}:{password}@/{db}", isolation_level='AUTOCOMMIT')
with engine2.connect() as conn:
    conn.execute(text(create_refresh_updated_at_func.format(schema=my_schema)))
  • Related