如何正确使用python将字符串插入mysql?

时间:2014-12-23 03:58:13

标签: python mysql string

我对python和mysql很新。 当我尝试使用字符串字段插入一些记录时,我无法将它们插入到mysql中,因为它总是报告错误:ProgrammingError: (1064, 'You have an error in your SQL syntax。 我很困惑。 偶尔,我发现它的工作原理是在字符串字段中添加额外的“”,如下所示:

history_market_table_name = 'my_test'
f = ['field_a', 'field_b', 'field_c', 'field_d']
r = ['a', 'b', 'c', 'd']
my_time = "'" + str(datetime.now()) + "'"
target_sql = "insert into %s (time, %s, %s, %s, %s) values(%s, %s, %s, %s, %s)"  % (
history_market_table_name, f[0], f[1], f[2], f[3], my_time, repr(r[0]), repr(r[1]), repr(r[2]), repr(r[3]))

对不起,这些代码非常繁琐。 而且,我的方法肯定有问题 - 插入字符串类型的字段不是那么愚蠢! 看看my_time变量,多么荒谬。

任何人请解释如何使用python正确地将字符串插入mysql。 我退出了新的。 所以请给出正确的答案,我们非常感谢您的详细解释。

1 个答案:

答案 0 :(得分:0)

将格式字符串更改为

"insert into %s (time, %s, %s, %s, %s) values(%s, '%s', '%s', '%s', '%s')"

即,在您插入的其他未引用字符串值周围单引号,并在repr之后丢失%次调用。如果你要插入包含一个'字符的字符串值,这仍然会失败...有更好的方法,但他们不允许你参数化表名和字段名称(这是一个真正特殊的要求......),只有

补充:因为OP需要"直接表达' target_sql'变量",这里是:

fmt_str = "insert into %s (time, %s, %s, %s, %s) values(%s, '%s', '%s', '%s', '%s')"
target_sql = fmt_str % (history_market_table_name, f[0], f[1], f[2], f[3], 
                        my_time, r[0], r[1], r[2], r[3])

我觉得这种方式更具可读性。至于"这些东西的一些文件" OP也需要,MySQL每个版本都有这样的文件(OP没有提到他或她使用的版本),Python也是如此(同上,同上)。

更好的方式" (但允许参数化表格和字段名称)涉及使用"占位符"代替SQL字符串中的值,而不是字符串替换。

下面,     sql ="插入my_test(time,field_a,field_b,field_c,field_d)值(%s,%s,%s,%s,%s)'

(带有硬编码,非参数化,表和字段名称),以及稍后,对于在MySql DB上打开的给定cursor

cursor.execute(sql, (
    str(datetime.now()), r[0], r[1], r[2], r[3]))

不用担心引用,也不用担心任何注入" sql注入的可能性。攻击。