Использование psycopg2 для вставки списка кортежей, включающего поле массива JSON, в базу данных Postgres - PullRequest
0 голосов
/ 10 апреля 2020

Я пытаюсь вставить строки в базу данных, которая имеет три столбца: публикации, публикации_год и авторов. Авторы поля имеют тип JSON []. В настоящее время у меня есть следующий код:

query = "INSERT INTO " + store_table_name + "( " + ",".join(tuple(key_types.keys())) + ") VALUES %s"
try:
    # connect to the database
    conn, cur = pg_connect(DB_OSP, db_host, db_user, db_password)
    conn.set_isolation_level(psycopg2.extensions.ISOLATION_LEVEL_AUTOCOMMIT)

    logger.info('Adding %s rows to %s' % (len(data), store_table_name))

    execute_values(cur, query, data)

    cur.close()
    conn.commit()
# exception handling to follow

Данные - это список кортежей, где находится каждая запись (публикация, год публикации, авторы). Так, например, запись может выглядеть следующим образом:

('Sample Book', 2019, ['{"Author1_fname": "Billy", "Author1_lname": "Bob"}', '{"Author2_fname": "King", "Author2_lname": "Kong"}'])

Первоначально код не работает, поскольку существует несоответствие типов (он пытается вставить авторов в виде текстового массива вместо массива JSON ). Я попытался изменить массив на строковый тип, который тоже не работал. Я не совсем уверен, как явно добавить приведение «::: json []» с помощью execute_values. У кого-нибудь есть опыт в этом деле?

1 Ответ

1 голос
/ 10 апреля 2020

Попробуйте использовать Json из psycopg2.extras, отформатировав данные как:

(
  "Sample Book",
  2019, 
  Json([{"Author1_fname": "Billy", "Author1_lname": "Bob"}, {"Author2_fname": "King", "Author2_lname": "Kong"}])
)
...