Параметр связывания базы данных цитат алхимии на Postgres - PullRequest
0 голосов
/ 03 октября 2019

Я новичок в sql alchemy.

У меня есть локальный сервер postgres, и я хочу использовать sql alchemy для создания базы данных.

У меня есть следующий код:

connection = engine.connect()
connection.execute(
    text("CREATE DATABASE :database_name").bindparams(bindparam('database_name', quote=False)),
    database_name="test_db"
)

Но это, к сожалению, одиночные кавычки для параметра имени базы данных, который не работает в postgres. Журналы из sql alchemy:

[SQL: CREATE DATABASE %(database_name)s]
[parameters: {'database_name': 'test_db'}]
sqlalchemy.exc.ProgrammingError: (psycopg2.errors.SyntaxError) syntax error at or near "'test_db'" LINE 1: CREATE DATABASE 'test_db`'

В журналах postgres выполняется следующий оператор, который недопустим из-за одинарных кавычек. Допустимое значение будет содержать двойные кавычки:

CREATE DATABASE 'test_db'

Есть ли способ, чтобы параметр bind не был заключен в результирующий оператор? Я не хочу делать кавычки параметров и создание строк самостоятельно, так как я думаю, что эта абстракция должна обрабатываться sql alchemy - в случае, если я изменяю свой базовый движок базы данных, например, и это выглядит как механизм, который sql alchemy продвигает, чтобы избежать sqlИнъекции тоже.

Тот же вопрос будет применяться к другим операторам postgres, таким как создание пользователя с паролем или предоставление привилегий существующему пользователю, которые все должны цитировать, специфичные для postgres.

1 Ответ

1 голос
/ 03 октября 2019

Вы не можете иметь параметры в операторах, отличных от SELECT, INSERT, UPDATE или DELETE.

. Вам нужно будет создать оператор CREATE DATABASE как строку, содержащую базу данных. имя. Что-то вроде

from psycopg2 import sql

cursor.execute(
    sql.SQL("CREATE DATABASE {}").format(sql.Identifier('test_db'))
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...