如何格式化字符串元组?

时间:2018-10-02 11:18:53

标签: python sql sqlite

我有一个由sqlite3建立的数据库:

CREATE TABLE test_table (
                         username TEXT,
                         langFrom TEXT,
                         langTo   TEXT,
                         mode     INT,
PRIMARY KEY (
    username
));

现在,我想通过“ SELECT..WHERE”命令从中获取数据。为此,我正在查询:

def getData(self, **kwargs):
    s = """SELECT * FROM test_table WHERE {} = {}"""\
    .format(tuple(kwargs.keys()), tuple(kwargs.values()))

我这样使用这种方法:

test_DB.getData(username = 'classtest', langFrom = 'ru')

现在我有了查询,看起来像这样:

SELECT * FROM test_table WHERE ('username', 'langFrom') = ('classtest', 'ru')

但是我需要这样:

SELECT * FROM test_table WHERE (username, langFrom) = ('classtest', 'ru')

那我应该如何格式化我的字符串呢?

2 个答案:

答案 0 :(得分:1)

首先,您的查询语法无效,正确的SQL查询应为:

SELECT * FROM test_table WHERE username='classtest' and langFrom='ru';

第二点:永远不要对SQL查询使用字符串格式-正如您已经发现的那样,这很棘手,但在it opens your code to SQL injection attacks上更是如此。

正确的方法是在查询中使用db-api连接器的占位符(对于sqlite3为'?'),并将值作为第二个参数传递:

q = "SELECT * FROM test_table WHERE username=? and langFrom=?"
cursor = connection.cursor()
cursor.execute(s, ("classtest", "ru"))
return cursor.fetchall()

在这种情况下,因为要动态构建查询:

def getData(self, **kwargs):
    q = " AND ".join("{}=?".format(k) for k in kwargs)
    s = "SELECT * FROM test_table WHERE {}".format(q)
    c = self.connection.cursor() 
    c.execute(s, kwargs.values())
    return c.fetchall()

但是您最好使用像peewee这样的轻量级ORM,而不是尝试重新发明suqre轮...

答案 1 :(得分:-1)

这应该有效

def getData(self, **kwargs):
    s = """SELECT * FROM test_table WHERE ({}) = {};"""\
    .format(', '.join(kwargs.keys()), tuple(kwargs.values()))