如何格式化字符串的元组?

2024-04-28 13:27:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个数据库,由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')

那么我应该如何格式化我的字符串来实现这一点呢?你知道吗


Tags: textfromtest数据库rutableusernamewhere
2条回答

这应该管用

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

首先,您的查询语法无效,正确的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()

但是你最好使用一个轻量级的ORM,比如peewee,而不是试图重新发明suqre轮子。。。你知道吗

相关问题 更多 >