2015-11-18 5 views
4

У меня есть список, состоящий из словарей называется 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, будет ли кто-нибудь сможет подтвердить это?

+0

Поправьте меня, если я не прав - если дубликат ключа существует Вы хотите обновите свой столбец org только со всеми новыми значениями, конкатенированными, и это тоже, только если org столбец null (поскольку вы использовали «ifnull»). ie org будет содержать все новые значения вместе, если его значение null .. –

+0

@ManojSalvi, почти правильно , Если есть повторяющийся ключ, новые значения * only * столбец 'Org' должен быть объединен с исходными. Неужели мой «ifnull» неуместен? –

ответ

1

Ознакомившись с кодом и запросом об ошибке, я согласен с тем, что построенный запрос методом executemany неверен. Я бы порекомендовал вам создать свою вставку более ручным образом, перейдя по параметрам и просто выполнив ее без соответствующего метода.

Также MySQL AFAIK отлично справляется с использованием одинарных кавычек, поэтому, если вы помещаете запрос в двойные кавычки, используйте одинарные кавычки как внутренние классификаторы строк - таким образом вам не нужно все время выходить.

0

Я думаю, что есть ошибка синтаксиса в:

ON DUPLICATE KEY UPDATE `Org`=concat(ifnull(`Org`, ""), ", ", 

Вы нужны две двойные кавычки (или две одинарные кавычки)

ON DUPLICATE KEY UPDATE `Org`=concat(ifnull(`Org`, ""), "", "", 

Обратите внимание, что, кажется, у вас есть два раза этот вопрос, потому что команда повторяется (??)

Это ваш запрос:

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; 
+0

Я думаю, вы ошибаетесь. Я хотел объединить '', ''в строку, чтобы конечный эффект был чем-то вроде« Org1, Org2, Org3 ». В вашем предположении я просто конкатенацию двух пустых пространств без эффекта, правильно? –

0

Я не знаю, если проблема уже решена, но в последнее время мне пришлось пробеге запрос

**INSERT INTO .... ON DUPLICATE KEY UPDATE** 

// Assuming conn as a connection to a MySQL database and member a dict with the required variables 
    cursor = conn.cursor() 

    query = (member['handle'], member['org'], member['role'], member['rank'], 
       member['visibility'], member['stars'], member['type']) // Tuple object of the required values from the dict 

    cursor.execute(""" 
         INSERT INTO Citizens 
         (Handle,Org,Role,Rank,Visibility,Stars,Type) 
         VALUES(%s,%s,%s,%s,%s,%s,%s) 
         Handle = VALUES(Handle) 
         Org= VALUES(Org) 
         Role= VALUES(Role) 
         Rank= VALUES(Rank) 
         Visibility= VALUES(Visibility) 
         Stars= VALUES(Stars) 
         Type= VALUES(Type) 
        """, query) 
    conn.commit() 
Смежные вопросы