如何将列表中的数据动态添加到数据库 (PostgreSQL)

How to dynamically add data from a list to a database (PostgreSQL)

数据库已经创建(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)

我需要在数据库中的 table 中插入值,其中包含名为:'param_1': 'paRam_2' e.t.c.

的字段

如何生成查询字符串?

我很乐意提供任何帮助,提前致谢,stack。

参数替换只能用于传递列 values,不能传递列 names,因此我们需要构建一个列表要插入到 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)

感谢@GordThompson 的回复。这非常有帮助,根据您的回复,我创建了两个函数: - 一个用于读取错误字符串。
- 第二个将值插入 table.

我想注意到 psycopg2 没有争取在查询字符串生成中动态查找 table 名称

import psycopg2

def insert_to(self, table_name: str, data: dict):
    # формирование строки запроса
    columns = ','.join([f'"{x}"' for x in data])
    param_placeholders = ','.join(['%s' for x in range(len(data))])
    query = f'INSERT INTO "{table_name}" ({columns}) VALUES ({param_placeholders})'
    param_values = tuple(x for x in data.values())
    try:
        self.cur.execute(query, param_values)
    except Exception as e:
        log.exception(f'\r\nException: {e}')
    else:
        log.warning(f'INSERT INTO "{table_name}" {data}')


def read_from(self, table_name: str, dict_for_get_pk: dict) -> any:
    # формирование строки запроса
    columns = ','.join([f'"{x}"' for x in dict_for_get_pk])
    param_placeholders = ','.join(['%s' for x in range(len(dict_for_get_pk))])
    query = f'SELECT * FROM "{table_name}" WHERE ({columns}) = ({param_placeholders})'
    param_values = tuple(x for x in dict_for_get_pk.values())
    try:
        self.cur.execute(query, param_values)
    except Exception as e:
        log.exception(f'\r\nException: {e}')
    else:
        db_values = self.cur.fetchall()
        if db_values:
            return db_values[0]
        else:
            return None