【问题标题】:MySQL Python: JSON type throws error on assignmentMySQL Python:JSON 类型在赋值时抛出错误
【发布时间】:2021-11-13 21:50:09
【问题描述】:

我无法使用ON DUPLICATE KEY UPDATE 更新 JSON 类型的单元格,因为会引发错误。我正在使用mysql-connector-python。这是一个最小(不)工作的例子:

首先,我将我的表定义为:

cursor = db.cursor()
cursor.execute('''
    CREATE TABLE test (
        id INT AUTO_INCREMENT PRIMARY KEY,
        foo VARCHAR(255) NOT NULL UNIQUE,
        bar JSON NOT NULL
    )
''')

然后我尝试将值插入表中:

val = [
    {
        'foo': 'lorem ipsum',
        'bar': json.dumps({'a': 1}),
    },
    {
        'foo': 'dolor sit amet',
        'bar': json.dumps({'a': 2}),
    },
]
sql = '''
    INSERT INTO test
        (foo, bar)
    VALUES
        (%(foo)s, %(bar)s)
    ON DUPLICATE KEY UPDATE 
        bar = %(bar)s
'''
cursor = db.cursor()
cursor.executemany(sql, val)

这会导致错误:

ProgrammingError: 1064 (42000): 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 '%(bar)s' at line 6

如果我将bar = %(bar)s 的行更改为bar = \'%(bar)s\',代码会愉快地执行...至少是第一次,直到我再次运行此部分以调用ON DUPLICATE KEY UPDATE 子句,然后导致另一个错误:

DataError: 3140 (22032): Invalid JSON text: "Invalid value." at position 0 in value for column 'test.bar'.

能否请您告诉我如何修正我的语法?

【问题讨论】:

  • 您需要重新考虑“ON DUPLICATE”子句。把它拿出来然后使用'INSERT INTO test (foo, bar) VALUES (?,?)'
  • @DarkKnight 那么“ON DUPLICATE”的替代方案是什么?我想在一个表中插入多个值,但是其中一些值可能与表中的另一行具有相同的唯一值——在这种情况下,我希望更新该行的其余值(除了唯一值) . “ON DUPLICATE”不是执行此操作的标准方法吗?或者我应该区分需要插入的行和需要预先更新的行?
  • 如果是这种情况,那么只需删除 foo 上的 UNIQUE 约束
  • @DarkKnight 我不想删除 UNIQUE 约束——它是设计的。我需要 foo 是唯一的,因此删除所述约束,只是为了让上面的示例有效,听起来是一个非常糟糕的做法。

标签: python mysql sql mysql-connector-python


【解决方案1】:

您也可以在 UPDATE 子句中使用 VALUES function

在 ON DUPLICATE KEY UPDATE 子句中的赋值表达式中,您可以使用 VALUES(col_name) 函数来引用来自 INSERT ... ON DUPLICATE KEY UPDATE 语句的 INSERT 部分的列值。换句话说,ON DUPLICATE KEY UPDATE 子句中的 VALUES(col_name) 是指将插入的 col_name 的值,没有发生重复键冲突。这个函数在多行插入中特别有用。

sql = '''
    INSERT INTO test
        (foo, bar)
    VALUES
        (%(foo)s, %(bar)s)
    ON DUPLICATE KEY UPDATE 
        bar = VALUES(bar)
'''

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-10
    • 2021-12-28
    • 1970-01-01
    • 2015-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多