我有以下一些python代码:
insert_table = settings.INSERT_TABLE_NAME
self.execute(
"""
INSERT INTO `%(insert_table)s`
(time, rem_host, username, our_result,
upstream_result, reason, solution, difficulty)
VALUES
(FROM_UNIXTIME(%(time)s), %(host)s,
%(uname)s,
%(lres)s, 'N', %(reason)s, %(solution)s, %(difficulty)s)
""",
{
"insert_table": insert_table,
"time": v[4],
"host": v[6],
"uname": v[0],
"lres": v[5],
"reason": v[9],
"solution": v[2],
"difficulty": v[3]
}
)
我遇到的问题是SQL查询的结果在" insert_table'周围包含单引号。变量所以结果是:
INSERT INTO `'my_table_name'`
所以它显然打破了这个问题。
有人对如何正确配置这个有任何建议吗?
答案 0 :(得分:1)
您不能使用SQL参数来插入表名。你必须为这些部分使用经典的字符串格式。
这是SQL参数的点;它们引用值,因此它们不可能被解释为SQL语句或对象名称。
以下是有效的,但您需要注意表名的来源:
"""
INSERT INTO `{}`
(time, rem_host, username, our_result,
upstream_result, reason, solution, difficulty)
VALUES
(FROM_UNIXTIME(%(time)s), %(host)s,
%(uname)s,
%(lres)s, 'N', %(reason)s, %(solution)s, %(difficulty)s)
""".format(insert_table),
{
"time": v[4],
"host": v[6],
"uname": v[0],
"lres": v[5],
"reason": v[9],
"solution": v[2],
"difficulty": v[3]
}
如果insert_table
是用户来源的,那么最好的办法是首先根据预先确定的现有桌名列表对其进行审核。