Прежде чем пытаться что-то вроде:
statement = "CREATE USER %s PASSWORD %s" % (user, pw)
Пожалуйста, убедитесь, что вы прочитали: http://www.initd.org/psycopg/docs/usage.html
В основном проблема заключается в том, что если вы принимаете пользовательский ввод (я предполагаю, что когда кто-то входитв пользователе & pw) вы, вероятно, оставляете себя открытым для SQL-инъекций.
Как утверждает PsyCopg2:
Warning Never, never, NEVER use Python string concatenation (+) or string parameters interpolation (%) to pass variables to a SQL query string. Not even at gunpoint.
Как было определено, Postgres (или Psycopg2), похоже, недать хороший ответ на экранирование идентификаторов.На мой взгляд, лучший способ решить эту проблему - предоставить метод фильтрации «белого списка».
, то есть: определить, какие символы разрешены в «user» и «pw».(возможно A-Za-z0-9_).Будьте осторожны, чтобы не включать escape-символы ('или; и т. Д.) Или, если вы это делаете, избегать этих значений.