我正在从给定的输入创建SQL命令:
def do_add(self, table, full_sql_command="INSERT INTO {} VALUES ({})"):
""" Add a column to a specified table name """
add_command = raw_input("INSERT INTO {} VALUES ".format(table))
self.__create_sql_command(full_sql_command, table, add_command.split(" "))
def __create_sql_command(self, full, tablename, addable):
print full.format(tablename, ', '.join(addable))
我需要输出的是INSERT INTO <table-name> VALUES ('<val-1>', '<val-2>', '<etc..>')
截至目前,我得到以下输出:
INSERT INTO inventory VALUES test test test
# <= INSERT INTO inventory VALUES (test, test, test)
如何获取要添加的值的引号?
答案 0 :(得分:1)
不要将参数包装在引号中,而是使用参数化查询。它实际上将根据需要添加引号,透明且不会因为例如问题而出现问题。输入本身的引号,无论是有意的(SQL注入攻击)还是偶然的。
这是参数化查询的示例。
cursor.execute("INSERT INTO table VALUES (?, ?, ?)", (var1, var2, var3))
正如您所看到的,您需要将两个单独的参数传递给execute()
,查询模板和值,因此需要重新调整代码。
注意:不同的数据库模块接受different placeholders参数化查询。例如,sqlite3
如上所述接受?
,但也允许命名参数(在字典而不是元组中传递):
cursor.execute("INSERT INTO table VALUES (:who, :age)", {"who":"Bill", "age": 33})
答案 1 :(得分:-1)
我不是SQL人,但如果你输入的表数据用空格分隔,那么一点for循环就能完成你的工作, 说:
l=raw_input('Enter Table contents separated by space.').split(' ')
l1='('
for i in l:l1=l1+i+', '
l1=l1[:len(l1-3)] #for removing extra comma and space left after loop
l1=l1+')'
然后在任何你想要的地方使用l1。您可以使用私有属性或其他东西,以获得更多保护!
答案 2 :(得分:-4)
如果有人好奇,这就是我最终做的事情:
从不在生产中这样做,它极易受到SQL注入
def __create_sql_command(self, full, tablename, addable):
return full.format(tablename, ', '.join(map(lambda x: "'" + x + "'", addable)))
#<= CREATE TABLE test ('test1', 'test2', 'test3')