Как создать таблицу в базе данных psql с помощью python?

#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. Мой плохой, достаточно справедливый! Я не думал в контексте внешнего доступа к системе.