INSERT INTO оператор для загрузки большого файла JSON с помощью psycopg2 - PullRequest
0 голосов
/ 01 февраля 2019

Я пытаюсь загрузить в VALUES весь файл JSON, используя INSERT INTO.Я создал модуль с классом и методом для получения результатов.В другом модуле я создал экземпляр для выполнения метода и назначил его переменной.Я назначил переменную VALUES, и она продолжает давать сбой.Поэтому вместо того, чтобы вводить вручную тысячи значений, я хочу загрузить файл со всеми значениями в VALUES, вызвав его из другого метода.

Исходный файл json (pop_data.json) представляет собой список словарей.,В первом модуле (население_filtered.py) я отфильтровал и создал новый файл json (pop_dict.json), а затем создал цикл для удаления квадратных скобок, чтобы я мог «вывести» словари без квадратных скобок.Я попытался "вернуть", но он возвращает только 1 строку.

Второй модуль (pop_dict_postgres.py) импортирует psycopg2 и метод класса из модуля pop_filtered.py.Я успешно подключился к базе данных и создал таблицу в PostgreSQL.Сейчас я пытаюсь ВСТАВИТЬ В ЗНАЧЕНИЯ, вызывая метод класса open_new_file ().

Первый модуль: pop_filtered.py

import json

class CreateFile:
    """Load and write data to a json file."""
    def __init__(self, filename, new_file):
        self.filename = filename
        self.new_file = new_file

    def open_file(self):
        """Open & load data to a file."""
        --snip--

    def extract_data(self):
        """Filter data."""
        --snip--

    def copy_data(self):
        """Write data to a file."""
        --snip--

    def open_new_file(self):
        """Print the new file."""
        with open(self.new_file) as nf:
            content = json.load(nf)
            for line in content:
                dict = {k:v for k, v in line.items()}
                yield dict

if __name__ == '__main__':
    source = CreateFile('population_data.json', 'pop_dict.json')
    --snip--

Второй модуль: pop_dict_postgres.py

import psycopg2
from population_filtered import CreateFile

source = CreateFile('population_data.json', 'pop_dict.json')

class DatabaseConnection:
    """Open postgresql database and create a cursor"""
    def __init__(self):
        self.conn = psycopg2.connect(….)
        self.conn.autocommit = True
        self.cur = self.conn.cursor()

    def create_table(self):
        """Create postgresql database table."""
        self.cur.execute("CREATE TABLE pop_data(id serial PRIMARY KEY NOT NULL, country_name TEXT)")

    def insert_data(self):
        """Insert data into postgresql database table."""
        insert_command = "INSERT INTO pop_data(country_name) VALUES (%s)"
        new_data = {k: v for k, v in source.open_new_file().items()}
        self.cur.execute(insert_command, new_data)

if __name__ == '__main__':
    database_connection = DatabaseConnection()
    database_connection.create_table()
    database_connection.insert_data()

Ожидайте запрос списка словарей в PostgreSQL под столбцом «country_name».

...