Python MySQLdb cursor.execute()插入不同数量的值

时间:2015-07-20 15:40:45

标签: python mysql mysql-python

已经提出了类似的问题,但所有这些问题 - 例如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))

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

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

我如何定义一个方法,它可以采用任意的,先前未定义的值与MySQLdb兼容的值?可能吗?或者我错过了关于字符串插值的内容?

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

两个数据库: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)

1 个答案:

答案 0 :(得分:2)

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

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