programing

Python에서 JSON을 SQLite로 변환 - json 키를 데이터베이스 열에 올바르게 매핑하는 방법

muds 2023. 3. 17. 22:03
반응형

Python에서 JSON을 SQLite로 변환 - json 키를 데이터베이스 열에 올바르게 매핑하는 방법

작성한 JSON 파일을 SQLite 데이터베이스로 변환합니다.

json(텍스트 에디터를 통한 데이터 입력)과 SQLite(SQLite Studio와 같은 스프레드시트와 유사한 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 파일의 각 "블록"(이 경우 "local", "coord", "sentido", "veiculos", "modalidade", "regime", "pistas" emedico)에서 프로그래밍 방식으로 키를 읽고 동일한 열로 데이터베이스를 만들고 삽입하려면 어떤 전략/방법을 사용해야 합니까?

저는 Python을 사용해 본 경험이 있지만, SQL을 시작한 지 얼마 되지 않았기 때문에 좋은 프랙티스에 대해 상담을 받고 싶습니다만, 반드시 준비된 레시피는 아닙니다.

python 코드는 다음과 같습니다.

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

그래야 할 것 같아요.

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

연산자는 왼쪽에 있는 문자열에 형식 코드가 포함되어 있을 것으로 예상하기 때문입니다.

이제 당신이 이 일을 하기 위해 필요한 것은keys올바른 순서로 의약품 표의 새 행에 대한 값을 포함하는 튜플(또는 목록)이어야 한다.다음 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 (?,?,?,?,?,?,?)

언급URL : https://stackoverflow.com/questions/8811783/convert-json-to-sqlite-in-python-how-to-map-json-keys-to-database-columns-prop

반응형