Как динамически добавлять данные из списка в базу данных (PostgreSQL) - PullRequest
1 голос
/ 16 октября 2019

База данных уже создана (PostgreSQL)

Есть список:

data = 
['param_1', 0], 
['amp', 0], 
['voltage', 1], 
['params', 1], 
['antenna', 1], 
['freq', 0.00011000000085914508] 

Я пытался

import psycopg2
from psycopg2 import sql 

    with psycopg2.connect(dbname='db_name', user='postgres',
                      password='123', host='localhost') as conn:
        conn.autocommit = True
        with conn.cursor() as cur:
            query = "INSERT INTO table_name (%s) VALUES (%s);"
            cur.executemany(query, data)

Мне нужно вставить значения в таблицув базе данных, которая содержит поля с именами: 'param_1': 'paRam_2' e.t.c.

Как мне сгенерировать строку запроса?

Буду рад любой помощи, заранее спасибо, стек.

1 Ответ

2 голосов
/ 17 октября 2019

Подстановка параметров может использоваться только для передачи столбца значений , а не столбца имен , поэтому нам нужно будет создать список имен столбцов для вставки в текст команды SQL. В частности, нам нужно

  1. построить строку имен столбцов через запятую
  2. построить строку заполнителей параметров через запятую
  3. создать команду INSERT, включая два элемента выше
  4. создать кортеж (числовых) значений параметров
  5. выполнить команду

Это будет выглядеть примерно так:

# create environment
# ~~~~~~~~~~~~~~~~~~
data = (
['param_1', 0],
['amp', 0], 
['voltage', 1], 
['params', 1], 
['antenna', 1], 
['freq', 0.00011000000085914508]
)

# example code
# ~~~~~~~~~~~~
columns = ','.join([f'"{x[0]}"' for x in data])
print(columns)
# "param_1","amp","voltage","params","antenna","freq"

param_placeholders = ','.join(['%s' for x in range(len(data))])
print(param_placeholders)
# %s,%s,%s,%s,%s,%s

sql = f"INSERT INTO table_name ({columns}) VALUES ({param_placeholders})"
print(sql)
# INSERT INTO table_name ("param_1","amp","voltage","params","antenna","freq") VALUES (%s,%s,%s,%s,%s,%s)

param_values = tuple(x[1] for x in data)
print(param_values)
# (0, 0, 1, 1, 1, 0.00011000000085914508)

cur.execute(sql, param_values)
...