【问题标题】:Python MySQLdb cursor.execute() insert with varying number of valuesPython MySQLdb cursor.execute() 插入具有不同数量的值
【发布时间】:2015-10-09 19:49:27
【问题描述】:

已经提出了类似的问题,但所有这些问题 - 例如 This One 只处理指定数量的值。

例如,我尝试通过以下方式执行此操作:

def insert_values(table, columns, values, database):
    """
    columns - a string representing tuple with corresponding columns
    values - a tuple containing values
    """
    query=database.cursor()
    query.execute("INSERT INTO `{}` {} VALUES{}".format(table,columns,str(values))) 

但这并不好 - 虽然插入最初看起来很好(接受并提交到数据库),但很快就开始出现数据类型错误,这来自将所有数据类型转换为字符串。例如:

c.execute("SELECT * FROM foo WHERE bar = %s AND baz = %s", (param1, param2))

我最初的方法还涉及到预转换日期时间对象,这可能不是 MySQLdb 的创建者所想的。

我在 MySQLdb 的其他示例中看到的方式涉及字符串插值,但这意味着将变量数定义为 '%s',并且它没有给代码带来灵活性。

我如何定义一个方法,该方法可以采用任意的、以前未定义的与 MySQLdb 兼容的值?可能吗?还是我错过了关于字符串插值的一些东西?

[edit] 我想到的方法的示例用法:

两个数据库:source_db、destination_db

row = source_db.cursor.execute('SELECT x from Y where z='1')

(返回元组)

insert_values('table_name','(column_name_1,column_name_2)',row, destination_db)

【问题讨论】:

    标签: python mysql mysql-python


    【解决方案1】:

    您应该使用字符串插值来为内容生成占位符,然后允许 DB-API 填充它们。例如:

    placeholders = ','.join('%s' for col in columns)
    query_string = "INSERT INTO `{}` {} VALUES ({})".format(table, columns, placeholders)
    query.execute(query_string, values)
    

    【讨论】:

    • 这看起来很好,谢谢你,但在我的情况下这会返回错误。 query.execute(query_string, values) 返回 TypeError: must be string or read-only buffer, not tuple, 而 query.execute(query_string% values) 当字段为MySQLdb 作为 dict 返回,给出 MySQL 语法错误。例如,选择返回一个元组: ('default', 'Default', 1, 26L, '{"description": "content available"}') 这会给出错误 _mysql_exceptions.ProgrammingError: (1064, 'You have an SQL 语法错误;(...) 在 \'description" 附近使用:
    • 如果不清楚,我很抱歉,但在格式化方面的回复非常有限;/
    • 我认为您只需要在值周围加上括号 - 已编辑。
    • values_tmp=[str(value).replace('"',"'") if type(value)==str else value for value in values] -> values=tuple(values_tmp) -这适用于用单引号替换双引号。现在整个查询工作...... MySQLdb lib这种挣扎正常吗?
    • 不,也没有理由这样做。我上面显示的代码工作正常 - 库为您转义了引号。
    猜你喜欢
    • 2013-02-02
    • 1970-01-01
    • 1970-01-01
    • 2012-10-26
    • 1970-01-01
    • 1970-01-01
    • 2015-01-12
    • 2015-09-05
    • 1970-01-01
    相关资源
    最近更新 更多