Skip to content

Disabling prepared statements entirely with SQLAlchemy? #1041

Closed

Description

@interrogator

I have some SQL strings with multiple commands (i.e. INSERT a; INSERT B;), which cannot be made into prepared statements.

When using SQLAlchemy, it seems like asyncpg is always called in such a way that prepared statements are always generated.

There is an issue on a related subject, where the prepared_statement_cache_size option can be used to avoid cacheing the statements. But this setting does not stop them from being used entirely. Most of the above issue is only about changing the way such statements are named/identified/stored. Even with this set to 0, the statements are still created and called.

The only way I can find to get around this problem is to call asyncpg more directly:

engine = create_async_engine()
async with engine.begin() as conn:
    raw = await conn.get_raw_connection()
    await raw.cursor()._connection.execute(script)

Is there any nicer solution for this? I'd like to skip get_raw_connection, .cursor() and _connection, and use SQLAlchemy more as intended, but without generating any prepared statements.

Also, a somewhat related question, does SQLAlchemy provide a way of accessing asyncpg's copy_to_table other than the above? I can't find much documentation about this, nor anything specific to COPY in the source.

Activity

  1. elprans commented on Aug 15, 2023

    @elprans
    Member

    But this setting does not stop them from being used entirely

    Prepared statements are an integral part of PostgreSQL extended query protocol which asyncpg uses. That said, I'm not sure why you would want to disable those as that flow should work just fine with pgbouncer. Can you give a more concrete example of a problem you're seeing?

  2. added 2 commits that reference this issue on Aug 16, 2023
    43d5198
    606a368
  3. added a commit that references this issue on Aug 17, 2023
    cbf64e1
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions