当前位置: 首页 > 面试题库 >

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

华景焕
2023-03-14
问题内容

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

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

我的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文件加载的字典没有特殊顺序,因此无法正确映射到数据库的列顺序。

因此,我问:“应该使用哪种策略/方法以编程方式从JSON文件中的每个“块”中读取密钥(在这种情况下,是“本地”,“协调”,“ sentido”,“
veiculos”,“ modalidade” “,” regime“,” pistas“和”
medicoes“),以相同的顺序创建具有列的数据库,然后插入具有适当值的行”?

我在Python方面有丰富的经验,但是从SQL才刚刚开始,所以我想对良好的做法提供一些建议,但不一定是现成的食谱。


问题答案:

您有以下python代码:

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

我认为应该是

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

因为%操作员希望字符串左边的字符串包含格式代码。

现在,只需要做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 (?,?,?,?,?,?,?)


 类似资料:
  • 我想把sqlite数据转换成jsonarray,但我遇到了一些问题,我写了这段代码,用hasmap从sqlite解析到arraylist并用它把它更改为json,用gson转换 这就是如何解析它

  • 很抱歉重复了这个问题,但我的问题是其他的。我有一个从json-string解析到map的JSON解析器方法。但是json-string有一个值,这个值也是json-string。大概是这样的: 因此,我的解析方法: 我在客户端得到响应: ?但是随后我得到一个错误,IDE告诉我,是一个字符串。 那么,我如何用我的UserData获得这个LinkedHashMap呢?对不起,为了我的英语。谢谢你。

  • 问题内容: 我想使用Python将JSON数据转换成Python对象。 我从Facebook API接收了JSON数据对象,我想将其存储在数据库中。 我当前在Django(Python)中的视图(包含JSON): 这可以正常工作,但是如何处理复杂的JSON数据对象? 如果能以某种方式将此JSON对象转换为Python对象以方便使用,会不会更好呢? 问题答案: 您可以使用和在一行中完成操作: 或者,

  • 本文向大家介绍如何将JSON数据转换为Python元组?,包括了如何将JSON数据转换为Python元组?的使用技巧和注意事项,需要的朋友参考一下 您可以先使用json.loads将json转换为dict,然后使用dict.items()将其转换为python元组。您可以使用Python中的json模块解析JSON文件。该模块解析json并将其放入字典中。然后,您可以像普通字典一样从中获取值。例如

  • 本文向大家介绍如何将JSON数据转换为Python对象?,包括了如何将JSON数据转换为Python对象?的使用技巧和注意事项,需要的朋友参考一下 以下代码将json对象(字符串)转换为python对象(字典)。我们导入json模块,并使用json.loads()方法执行此操作。 示例 输出