#python #sql #postgresql #psycopg2
#python #sql #postgresql #psycopg2
Вопрос:
Я запускаю этот скрипт и хочу создать таблицу, передав значения в запросе psql с использованием переменных. Итак, я могу создать несколько таблиц за один раз. Но эта cur.execute("CREATE TABLE IF NOT EXISTS(%s, %s)",[table_name, comp_schema])
строка выдает ошибку. Как я могу написать этот запрос для создания таблицы с заданной схемой?
import psycopg2
conn = psycopg2.connect(database="review_check", user = "xxx", password = "xxx",)
cur = conn.cursor()
print ("Opened database successfully")
comp_schema = """
as_of_date DATE PRIMARY KEY NOT NULL,
verified_reviews INTEGER,
lsa_total_reviews INTEGER
"""
table_name = 'comp_first'
cur.execute("CREATE TABLE IF NOT EXISTS(%s, %s)",[table_name, comp_schema])
conn.commit()
conn.close()
Комментарии:
1. psycopg2.ошибки. SyntaxError: синтаксическая ошибка в или рядом «(» СТРОКА 1: СОЗДАТЬ ТАБЛИЦУ, ЕСЛИ ОНА НЕ СУЩЕСТВУЕТ (‘comp_first’,
2. Смотрите Ответ пиро ниже, чтобы узнать, как правильно это сделать.
Ответ №1:
Используйте psycopg2.sql
модуль для динамического составления запроса. смотрите https://www.psycopg.org/docs/sql.html .
Ответ №2:
Здесь есть пара ошибок, как в синтаксисе SQL, так и в Python:
cur.execute("CREATE TABLE IF NOT EXISTS(%s, %s)",[table_name, comp_schema])
должно быть
cur.execute("CREATE TABLE IF NOT EXISTS %s (%s)"%(table_name, comp_schema))
Возможно, было бы проще во время разработки сначала создать запрос в отдельной переменной, а затем распечатать его, чтобы проверить, правильно ли он выглядит:
test = "CREATE TABLE IF NOT EXISTS %s (%s)"%(table_name, comp_schema)
print(test)
>>CREATE TABLE IF NOT EXISTS comp_first (
as_of_date DATE PRIMARY KEY NOT NULL,
verified_reviews INTEGER,
lsa_total_reviews INTEGER
)
Комментарии:
1. Пожалуйста, не поощряйте использование строковой композиции для создания динамических запросов. Это путь к
SQL
внедрению. Смотрите Ответ @piro ниже для получения ссылки на то, как правильно это сделать.2. Мой плохой, достаточно справедливый! Я не думал в контексте внешнего доступа к системе.