python - 如何将多行从 python 嵌套字典插入到 sqlite db
问题描述
我读取了一个 yaml 文件并将值提取到一个 python 列表中。我想将值转储到 sqlite db 中,并且列表的结构是嵌套的。我尝试了各种将数据存储在我的数据库中的方法,如下所示,但它们并没有解决问题。
当格式('a','b','c')的列表时,我可以毫无问题地插入表格。但是当我有一个键值对时,我遇到了问题。
Data structure:
[ { 'CPU': 2,
'jobname': 'Job1',
'memory': '4 GB',
'problem': 'Prob1',
'team': '1'},
{ 'CPU': 4,
'jobname': 'Job2',
'memory': '256 GB',
'problem': 'Prob3',
'team': '3'},
{ 'CPU': 5,
'jobname': 'Job3',
'memory': '8 GB',
'problem': 'Prob5',
'team': '1'}]
这是我尝试过的,但看起来它们的数据结构略有不同:Python : How to insert a dictionary to a sqlite database?
# read data from the config file
def read_yaml(file):
with open(file, "r") as stream:
try:
config = yaml.safe_load(stream)
except yaml.YAMLError as exc:
print(exc)
print("\n")
return config
q = read_yaml("queue.yaml")
# establish connection to sqlite database and save into db
conn = sqlite3.connect('queues.db')
c = conn.cursor()
# create a sqlite3 database to store the dictionary values
def create_table():
c.execute("CREATE TABLE IF NOT EXISTS queues(job TEXT, team
TEXT, problem TEXT, CPU INT, memory TEXT)")
create_table()
# insert data into the table
def dynamic_data_entry():
for item in q:
c.execute("INSERT INTO queues VALUES (?, ?, ?, ?, ?)", item)
conn.commit()
dynamic_data_entry()
这是输出错误: Traceback(最近一次调用最后一次):
File "queue_info.py", line 50, in <module>
dynamic_data_entry()
File "queue_info.py", line 47, in dynamic_data_entry
c.execute("INSERT INTO queues VALUES (?, ?, ?, ?, ?)", item)
sqlite3.ProgrammingError: Binding 1 has no name, but you supplied a
dictionary (which has only names).
解决方案
sqlite3
支持使用占位符语法:[key]
代替?
. 您也可以使用executemany代替for item in q:
c.executemany("INSERT INTO queues (job, team, problem, CPU, memory) VALUES
(:jobname, :team, :problem, :CPU, :memory);", data)
推荐阅读
- c - 在 C 中创建字符串,其中第一个字符是字符串长度
- python - Python“无法从'urllib3.util.ssl_'导入'ssl'”错误
- php - 在 Laravel 5.8 中阻止发送验证电子邮件地址电子邮件
- javascript - 如何使用 express 并且仅使用 JEST 来测试 rest api?
- java - Android 资源链接失败
- barcode-scanner - 在 Chrome 中将错误的条形码扫描到 Web 表单中?
- unit-testing - How can I know if something is a Integration Test or Unit Test
- javascript - 当使用从父级传递的参数在函数内部调用时,为什么 setTimeout 函数记录未定义?
- ssl - 如何使用 x.509 CA 证书在 tomcat 8.5 中启用 SSL
- c# - 如何添加包含 Grid、StackPanel 和 TextBlock 的 ListViewItem