PyMySQL executemany with ON DUPLICATE

Ber*_*rer 5 python mysql insert pymysql

我有一个由字典组成的列表member,我正在这样插入一个数据库

    # 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()
Run Code Online (Sandbox Code Playgroud)

它工作得很好,但是当我开始遇到重复成员的问题时,我决定添加一个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()
Run Code Online (Sandbox Code Playgroud)

但是,这样做我得到以下错误:

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;'
Run Code Online (Sandbox Code Playgroud)

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'}
]
Run Code Online (Sandbox Code Playgroud)

编辑:因为看起来这可能是PyMySQL本身的一个错误,有人能够证实吗?

nim*_*dil 1

从错误中查看您的代码和查询,我同意通过executemany方法构造的查询是不正确的。我建议您以更手动的方式循环遍历参数来构建插入,然后执行它而不使用executemany 方法。

另外,MySQL AFAIK 完全可以使用单引号,因此如果您将查询放在双引号中,请使用单引号作为内部字符串限定符 - 这样您就不需要一直转义。