0

Problem

I want to add a comment to a number of columns from Python in a PostgreSQL database. If I run the statement that my Python script produces in a database client manually everything works as it should. If I let Python run the statement via an sqlalchemy engine, nothing is updated.

Details

I have a dictionary in Python of the form { 'column name': 'column comment with some text'}.

I want to add this comments to an existing table in a Postgres database.

Manually I would run the following command in Postgres:

comment on column schema.table."column name" is 'column comment with some text'

Now in Python I want to run the same, but then looping over the dictionary. This is the code I use:

from sqlalchemy import create_engine, text

db = create_engine(f"postgresql://PGUSER:PGPASSWORD@PGHOST/PGDATABASE")

coldict = {'col1': 'col1 contains this data, etc... some more comments', 'col2': 'col2 shows something.'}

with db.connect() as con:
        for key in coldict:
            colname = key
            # Convert a single quote to two single quotes as that is what SQL likes.
            colcomm = coldict[key].translate(str.maketrans({"'": "''"}))
            stmt = f"comment on column schema.table.\"{colname}\" is '{colcomm}';"
            # print the statement that will be run for debugging
            print(stmt)
            # execute statement in database
            con.execute(text(stmt))

This prints out:

comment on column schema.table."col1" is 'col1 contains this data, etc... some more comments';
comment on column schema.table."col2" is 'col2 shows something.';

When I check the column comments with the query from this answer no comments are actually set.

If I copy-paste what is printed out into a database client and run it there, the column comment is updated as it should.

How can I update the column comment via a loop in Python?

1

1 Answer 1

4

You did not commit your changes, so they are automatically rolled back. One way to do it is:

con.execute(text(stmt).execution_options(autocommit=True))
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.