在raw_input给出的字符串周围添加单引号

时间:2017-05-18 23:04:00

标签: python python-2.7 sqlcommand

我正在从给定的输入创建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)

如何获取要添加的值的引号?

3 个答案:

答案 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')