Как исправить «неверный синтаксис ввода для типа json» при вставке json str в postgresql методом copy, используя python - PullRequest
0 голосов
/ 10 февраля 2019

Я пытаюсь вставить данные типа json методом copy в базу данных postgresql.Однако я получаю ошибку, упомянутую ниже

invalid input syntax for type json

DETAIL:  Expected end of input, but found ""aco"".
CONTEXT:  JSON data, line 1: "{""aco"...
COPY flights2016jsn04, line 1, column flight: ""{""aco"": [""AXE"", ""AXE"", ""AXE"", ""AXE""], ""dist2Org"": 984753, ""flight_att"": {""ypos"": [8..." 

Я не уверен, в чем проблема, и немного смущен тем, что я читаю в Интернете.Ниже мой код с некоторыми примерами данных.

import json
import io
import pandas as pd
import psycopg2


dict_ = {"dist2Org": 984753, "aco": ["AXE", "AXE", "AXE", "AXE"],
     "flight_att": {"xpos": [823.08988, 6540.32231, 999, 33321],
                    "ypos": [823.08988, 6540.32231, 999, 33321], "zpos": [823.08988, 6540.32231, 999.33321]}}

json_ = json.dumps(dict_)

col_json = ["id", "flight"]
df = pd.DataFrame([65654, json_]).T

df.to_csv('test_df')
output = io.StringIO()
# ignore the index
df.to_csv(output, sep='\t', header=False, index=False)
output.getvalue()
# jump to start of stream
output.seek(0)

conn = None
try:
    # connection string
    conn_string = '{0}{1} {2}'.format("host='localhost' dbname=", 'postgres', "user='postgres' password='xxxx'")
    # conn_string = "host='localhost' dbname='postgres' user='postgres' password='xxxx'"

    # connect to the PostgreSQL database
    conn = psycopg2.connect(conn_string)

    # create a new cursor
    cur = conn.cursor()

    # load data

    cur.copy_from(output, 'flights2016jsn04', null="", columns=(col_json))

    # # commit the changes to the database
    conn.commit()

    # close communication with the database
    cur.close()

except (Exception, psycopg2.DatabaseError) as error:
    print(error)

finally:
    if conn is not None:
        conn.close()

1 Ответ

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

Кажется, Postgres поддерживает только цитирование для ввода csv .В текстовом формате с разделением \t кавычек не ожидается.Pandas, с другой стороны, использует " в качестве символа кавычки по умолчанию, что часто встречается в JSON и требует экранирования.

Существует два варианта:

  • Если вы знаете, что в ваших данных не будет \t s, вы можете вместо этого попробовать df.to_csv(sep='\t', quoting=csv.QUOTE_NONE).
  • Использовать copy_expert psycopg2 для копирования CSV.
...