我有一个由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')
那我应该如何格式化我的字符串呢?
答案 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()))