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

Python MySQLdb cursor.execute()插入值的数量不同,python,mysql,mysql-python,Python,Mysql,Mysql Python,有人问过类似的问题,但它们都只涉及特定数量的值 例如,我尝试通过以下方式进行此操作: def insert_values(table, columns, values, database): """ columns - a string representing tuple with corresponding columns values - a tuple containing values """ query=database.cursor()

有人问过类似的问题,但它们都只涉及特定数量的值

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

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))
placeholders = ','.join('%s' for col in columns)
query_string = "INSERT INTO `{}` {} VALUES ({})".format(table, columns, placeholders)
query.execute(query_string, values)
我最初的方法还涉及预转换datetime对象,这可能不是MySQLdb的创建者想要的

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

我如何定义一个方法,它可以接受任意数量的、以前未定义的、与MySQLdb兼容的值?可能吗?还是我遗漏了一些关于字符串插值的内容

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

两个数据库:源数据库、目标数据库

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


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

c.execute("SELECT * FROM foo WHERE bar = %s AND baz = %s", (param1, param2))
placeholders = ','.join('%s' for col in columns)
query_string = "INSERT INTO `{}` {} VALUES ({})".format(table, columns, placeholders)
query.execute(query_string, values)

这看起来非常好,谢谢你,但在我的例子中,这返回了错误。query.execute(query\u string,values)返回TypeError:必须是字符串或只读缓冲区,而不是元组,而query.execute(query\u string%values)当MySQLdb以dict形式返回字段时,会给出MySQL语法错误。例如,select返回一个元组:('default','default',126l',{“description”:“content available”}),这会给出一个错误_mysql_exceptions.ProgrammingError:(1064,'您的SQL语法有错误;(…)使用near'description“:如果不清楚,我很抱歉,但在格式化方面,答复非常有限;/I认为您只需要在值周围添加参数即可-已编辑。值\u tmp=[str(value)。如果类型(value)==str else value for value in values]->values=tuple(values\u tmp),则替换(“,”)”-这可以用单引号替换双引号。现在整个查询都可以工作了…MySQLdb lib的这种情况正常吗?不,没有理由这样做。我上面展示的代码工作正常-库可以为您转义引号。