我对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。 我退出了新的。 所以请给出正确的答案,我们非常感谢您的详细解释。
答案 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注入的可能性。攻击。