У меня есть список, состоящий из словарей называется member
, что я вставив в базе данных, как такPyMySQL executemany с дублированием
# Executes query for each dictionary in member.
cursor.executemany("INSERT INTO `Citizens` (`Handle`,`Org`,`Role`, "
"`Rank`,`Visibility`,`Stars`,`Type`) VALUES "
"(%(handle)s,%(sid)s,%(roles)s,%(rank)s,"
"%(visibility)s,%(stars)s,%(type)s)", member)
# Commits changes to the database.
conn.commit()
Он работал отлично, но когда я начал иметь проблемы с повторяющимися членами, я решил добавить a ON DUPLICATE
. Идея состоит в том, что если член дубликат, мы хотим обновить его столбец Org
, объединив новые данные. Поэтому я изменил код этого
# Executes query for each dictionary in member.
cursor.executemany("INSERT INTO `Citizens` (`Handle`,`Org`,`Role`, "
"`Rank`,`Visibility`,`Stars`,`Type`) VALUES "
"(%(handle)s,%(sid)s,%(roles)s,%(rank)s,"
"%(visibility)s,%(stars)s,%(type)s) ON DUPLICATE"
" KEY UPDATE `Org`=concat(ifnull(`Org`, \"\"), "
"\", \", %(sid)s);", member)
# Commits changes to the database.
conn.commit()
Однако при этом я получил следующее сообщение об ошибке:
There was a problem inserting member(s): (1064, "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '('real_lethality','000',0,'Master','visible',5,'affiliate') ON DUPLICATE KEY UPD' at line 3")
Would you like to see the failed SQL query?[Y/n]
b'INSERT INTO `Citizens` (`Handle`,`Org`,`Role`, `Rank`,`Visibility`,`Stars`,`Type`) VALUES \n(\'fullmetaljim\',\'000\',\'Founder\',\'Master\',\'visible\',5,\'main\') ON DUPLICATE KEY UPDATE `Org`=concat(ifnull(`Org`, ""), ", ", \'000\'),\n(\'real_lethality\',\'000\',0,\'Master\',\'visible\',5,\'affiliate\') ON DUPLICATE KEY UPDATE `Org`=concat(ifnull(`Org`, ""), ", ", \'000\')\n;'
ли я реализован ON DUPLICATE
неправильно? Как я могу сделать эту работу правильно?
Образец member
:
[
{'roles': [],
'rank': 'No SCB account',
'type': 'main',
'stars': 2,
'visibility': 'visible',
'sid': 'imperium',
'handle': 'freakyeagle'
},
{'roles': [],
'rank': 'Fleet Member',
'type': 'main',
'stars': 1,
'visibility': 'visible',
'sid': 'imperium',
'handle': 'cadimus'},
{'roles': [],
'rank': 'Fleet Member',
'type': 'main',
'stars': 1,
'visibility': 'visible',
'sid': 'imperium',
'handle': 'belleal'}
]
EDIT: Как кажется, это может быть ошибка в самой PyMySQL, будет ли кто-нибудь сможет подтвердить это?
Поправьте меня, если я не прав - если дубликат ключа существует Вы хотите обновите свой столбец org только со всеми новыми значениями, конкатенированными, и это тоже, только если org столбец null (поскольку вы использовали «ifnull»). ie org будет содержать все новые значения вместе, если его значение null .. –
@ManojSalvi, почти правильно , Если есть повторяющийся ключ, новые значения * only * столбец 'Org' должен быть объединен с исходными. Неужели мой «ifnull» неуместен? –