gpt4 book ai didi

python - 在 Python 中将 JSON 转换为 SQLite - 如何将 json 键正确映射到数据库列?

转载 作者:IT老高 更新时间:2023-10-28 12:46:21 34 4
gpt4 key购买 nike

我想将我创建的 JSON 文件转换为 SQLite 数据库。

我的意图是稍后决定哪个数据容器和入口点最好,json(通过文本编辑器输入数据)或 SQLite(通过 SQLiteStudio 等类似电子表格的 GUI 输入数据)。

我的json文件是这样的(包含我所在城市一些十字路口的交通数据):

...
"2011-12-17 16:00": {
"local": "Av. Protásio Alves; esquina Ramiro Barcelos",
"coord": "-30.036916,-51.208093",
"sentido": "bairro-centro",
"veiculos": "automotores",
"modalidade": "semaforo 50-15",
"regime": "típico",
"pistas": "2+c",
"medicoes": [
[32, 50],
[40, 50],
[29, 50],
[32, 50],
[35, 50]
]
},
"2011-12-19 08:38": {
"local": "R. Fernandes Vieira; esquina Protásio Alves",
"coord": "-30.035535,-51.211079",
"sentido": "único",
"veiculos": "automotores",
"modalidade": "semáforo 30-70",
"regime": "típico",
"pistas": "3",
"medicoes": [
[23, 30],
[32, 30],
[33, 30],
[32, 30]
]
}
...

我已经创建了一个很好的数据库,它与这些 Python 代码行具有一对多的关系:

import sqlite3

db = sqlite3.connect("fluxos.sqlite")
c = db.cursor()

c.execute('''create table medicoes
(timestamp text primary key,
local text,
coord text,
sentido text,
veiculos text,
modalidade text,
pistas text)''')

c.execute('''create table valores
(id integer primary key,
quantidade integer,
tempo integer,
foreign key (id) references medicoes(timestamp))''')

但问题是,当我准备使用诸如 c.execute("insert into medicoes values(?,?,?,?,?,?,?)"之类的实际数据插入行时%keys),我意识到,由于从JSON文件加载的dict没有特殊的顺序,它没有正确映射到数据库的列顺序。

所以,我问:“我应该使用哪种策略/方法以编程方式从 JSON 文件中的每个“ block ”(在本例中为“local”、“coord”、“sentido”、“veiculos” , "modalidade", "regime", "pistas"e "medicoes"),创建具有相同顺序列的数据库,然后插入具有正确值的行”?

我在 Python 方面有相当丰富的经验,但我刚开始接触 SQL,所以我想获得一些关于良好实践的咨询,而不一定是现成的秘诀。

最佳答案

你有这个 python 代码:

c.execute("insert into medicoes values(?,?,?,?,?,?,?)" % keys)

我认为应该是的

c.execute("insert into medicoes values (?,?,?,?,?,?,?)", keys)

自从 % operator期望其左侧的字符串包含格式化代码。

现在你需要做的就是让 keys 成为一个元组(或列表),以正确的顺序包含 medicoes 表的新行的值。考虑以下 python 代码:

import json

traffic = json.load(open('xxx.json'))

columns = ['local', 'coord', 'sentido', 'veiculos', 'modalidade', 'pistas']
for timestamp, data in traffic.iteritems():
keys = (timestamp,) + tuple(data[c] for c in columns)
print str(keys)

当我使用您的示例数据运行此程序时,我得到:

(u'2011-12-19 08:38', u'R. Fernandes Vieira; esquina Prot\xe1sio Alves', u'-30.035535,-51.211079', u'\xfanico', u'automotores', u'sem\xe1foro 30-70', u'3')
(u'2011-12-17 16:00', u'Av. Prot\xe1sio Alves; esquina Ramiro Barcelos', u'-30.036916,-51.208093', u'bairro-centro', u'automotores', u'semaforo 50-15', u'2+c')

这似乎是您需要的元组。

您可以添加必要的 sqlite 代码,如下所示:

import json
import sqlite3

traffic = json.load(open('xxx.json'))
db = sqlite3.connect("fluxos.sqlite")

query = "insert into medicoes values (?,?,?,?,?,?,?)"
columns = ['local', 'coord', 'sentido', 'veiculos', 'modalidade', 'pistas']
for timestamp, data in traffic.iteritems():
keys = (timestamp,) + tuple(data[c] for c in columns)
c = db.cursor()
c.execute(query, keys)
c.close()

编辑:如果您不想对列列表进行硬编码,可以执行以下操作:

import json

traffic = json.load(open('xxx.json'))

someitem = traffic.itervalues().next()
columns = list(someitem.keys())
print columns

当我运行它时,它会打印:

[u'medicoes', u'veiculos', u'coord', u'modalidade', u'sentido', u'local', u'pistas', u'regime']

你可以像这样使用它:

import json
import sqlite3

db = sqlite3.connect('fluxos.sqlite')
traffic = json.load(open('xxx.json'))

someitem = traffic.itervalues().next()
columns = list(someitem.keys())
columns.remove('medicoes')
columns.remove('regime')

query = "insert into medicoes (timestamp,{0}) values (?{1})"
query = query.format(",".join(columns), ",?" * len(columns))
print query

for timestamp, data in traffic.iteritems():
keys = (timestamp,) + tuple(data[c] for c in columns)
c = db.cursor()
c.execute(query)
c.close()

当我尝试使用您的示例数据时,此代码打印的查询是这样的:

insert into medicoes (timestamp,veiculos,coord,modalidade,sentido,local,pistas) values (?,?,?,?,?,?,?)

关于python - 在 Python 中将 JSON 转换为 SQLite - 如何将 json 键正确映射到数据库列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8811783/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com