Как создать новую таблицу в Postgresql из файла .json, используя Python и psycopg2? - PullRequest
0 голосов
/ 20 февраля 2019

Я новичок в postgresql.Я хотел бы вставить информацию из .json и создать новую таблицу в Postgreswl, используя python / psycopg2.Я просмотрел некоторые посты stackoverflow и документацию psychopg2 без особой помощи.Ближайший вопрос - здесь , который я получил из следующих кодов:

Тестовый файл .json выглядит следующим образом (который имеет только одноуровневую структуру или не имеет вложенной структуры .json):

[{"last_update": "2019-02-01"}]

Попытка кода Python:

import psycopg2
from psycopg2.extras import Json
from psycopg2 import Error
from unipath import Path
import io

def insert_into_table(json_data):
    try:
        with psycopg2.connect(  user = "thisuser",
                                password = "somePassword",
                                host = "127.0.0.654165",
                                port = '5455',
                                database = "SqlTesting") as conn:

            cursor = conn.cursor()
            read_json = io.open(data_path, encoding='utf-8')
            read_json_all = read_json.readlines()

            query = "INSERT INTO new_table VALUES (%s)"
            cursor.executemany(query, (read_json_all,))
            conn.commit()

            print("Json data import successful")

    except (Exception, psycopg2.Error) as error:
        print("Failed json import: {}".format(error))

insert_into_table(data_path)

Приведенный выше код не работал, независимо от того, был ли new_table несуществующим или создан вручную в качестве заполнителя.Я получил следующее сообщение об ошибке:

Failed json import: relation "new_table" does not exist
LINE 1: INSERT INTO new_table VALUES ('[{"last_update": "2019-02-01"...

Во время отладки я увидел:

for i in read_json:
    print (i)

# will result
# [{"last_update": "2019-02-01"}]

И

print (read_json_all)

# Will result
# ['[{"last_update": "2019-02-01"}]']

1 Ответ

0 голосов
/ 20 февраля 2019

Я думаю, вы можете использовать sqlalchemy для помещения ваших данных в базу данных postgres.Ниже я использовал очень простой файл json и создал Pandas DataFrame.Затем я использовал sqlalchemy, чтобы поместить его в БД.Проверьте код здесь.Это должно привести вас туда, куда вы хотите пойти.

import psycopg2
import pandas as pd
import sqlalchemy
from sqlalchemy import create_engine
import json

from pandas.io.json import json_normalize
with open('example_1.json') as data_file:    
    d = json.load(data_file)

def create_table():
   conn=psycopg2.connect("dbname='SqlTesting' user='thisuser' password='somePassword' host='localhost' port='5432' ") 
   cur=conn.cursor() 
   cur.execute("CREATE TABLE IF NOT EXISTS new_table (color TEXT, fruit TEXT, size TEXT)")  
   conn.commit() 
   conn.close() 

create_table()

df = json_normalize(d)

engine = create_engine("postgresql+psycopg2://thisuser:somePassword@localhost:5432/SqlTesting")
df.to_sql("new_table", engine, index=False, if_exists='append')
print("Done")
...