如何将列表中的数据动态添加到数据库 (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 命令文本中的列名称。具体来说,我们需要
- 构建以逗号分隔的列名字符串
- 构建以逗号分隔的参数占位符字符串
- 创建 INSERT 命令,包括以上两项
- 创建一个(数字)参数值元组
- 执行命令
看起来像这样:
# 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
数据库已经创建(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 命令文本中的列名称。具体来说,我们需要
- 构建以逗号分隔的列名字符串
- 构建以逗号分隔的参数占位符字符串
- 创建 INSERT 命令,包括以上两项
- 创建一个(数字)参数值元组
- 执行命令
看起来像这样:
# 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