Psycopg2 - Как включить 'нулевые' значения при вставке словаря списка в таблицу в postgres? - PullRequest
0 голосов
/ 21 сентября 2018

Я анализирую свои xml-файлы и сохраняю их в словарь списка, где я вставлю их в таблицу на posgres с помощью psycopg2.Однако не все строки вставляются в таблицы (он вставляется только в наименьшее количество значений в списке).Вот фрагмент словаря списка:

dict_songs = {'title' : ['Need You Now', 'GTFO'...], 'format': ['MP4', 'MP3'...], 'type' : ['Country Pop', 'R&B Pop'..], 'year': [2010,2018..]}

dict_movie = {'title' : ['Searching', 'Sidewalk of New York'...], 'format': ['DVD', 'Blue Ray'...], 'type' : ['Thriller', 'Romcom'..], 'year': [2018..]

Когда я посчитал длину каждого списка в словаре, оказалось, что не все списки имеют одинаковую длину, например:

for key, value in dict_songs.items():
    #print value
    print(key, len([item for item in value if item]))

# The result is:
title 300000
format 189700
type 227294
year 227094

Заголовок будет основным ключом в таблице песен.Когда я вставляю этот словарь в postgres, он показывает только 189700 записей, а не 300000. Я хочу, чтобы он был 300000, и в качестве значений null (нет) укажите Null.То же самое касается dict_movie

. Этот код я использую для вставки списка диктов в таблицу:

keys = ['title', 'format', 'type','year']
insert_statement = 'insert into song_table (%s) values %s'
for t in zip(*(dict_songs[key] for key in keys)):
   cur.execute(insert_statement3, (AsIs(','.join(keys)),t))
myConnection.commit()

Есть идеи, почему или как это сделать?Спасибо!

1 Ответ

0 голосов
/ 21 сентября 2018

Я думаю, что проблема в том, что вы не знаете, где находятся значения None / NULL.Представьте себе эти списки:

dict_songs = {
  'title' : ['Need You Now', 'GTFO', 'Titletest']
  'type' : ['Country Pop', 'R&B Pop']
}

Ваша таблица может иметь значения NULL в трех позициях, и в списках нет данных, которые могли бы указывать на правильную:

+ -------------+-------------+-------------+-------------+
| title        | type        | type        | type        |
+--------------+-------------+-------------+-------------+
| Need You Now | Country Pop | Country Pop | NULL        |
| GTFO         | R&B Pop     | NULL        | Country Pop |
| Jinglebells  | NULL        | R&B Pop     | R&B Pop     |
+--------------+-------------+-------------+-------------+

Списки вынужно иметь None значений, чтобы вы знали, куда поместить NULL в таблицу базы данных.Как это:

dict_songs = {
  'title' : ['Need You Now', 'GTFO', 'Titletest']
  'type' : ['Country Pop', None, 'R&B Pop']
}
...