在Python中粘合字符串以组合SQL查询的最佳方法

在Python中粘合字符串以组合SQL查询的最佳方法,python,string-concatenation,Python,String Concatenation,我来自PHP背景。在编写SQL查询时,我倾向于这样做: $query = ' SELECT * FROM `table` AS t WHERE t.`categoryID` = '.$categoryID.' '; if(!empty($recordID)) { $query .= ' AND t.`recordID` = '.$recordID.' '; } $data = $db->fetchAll($query); 在Python中实现这一点的最佳/最

我来自PHP背景。在编写SQL查询时,我倾向于这样做:

$query = '
SELECT
    *
FROM `table` AS t
WHERE 
    t.`categoryID` = '.$categoryID.'
';

if(!empty($recordID))
{
$query .= '
    AND t.`recordID` = '.$recordID.'
';
}

$data = $db->fetchAll($query);

在Python中实现这一点的最佳/最有效的方法是什么?

使用Python可以实现这一点。最简单的方法是使用或对象

格式字符串语法的优点是不需要使用其他对象。例如:

query = "SELECT * FROM `table` AS t WHERE t.`categoryID`={}".format(category_id)
if record_id:
    query += " AND t.`recordID`={}".format(record_id)
尽管在大多数情况下,数据库Python包装器会让您更加安全(防止SQL注入):

您可能对以下链接感兴趣:

以下是它如何适用于Postgresql:

ps = db.prepare("SELECT * FROM information_schema.tables WHERE table_name = $1 LIMIT $2")
ps("tables", 1)

使用python DB-API参数替换:

symbol = 'IBM'

# Do this 
t = (symbol,)
c.execute('select * from stocks where symbol=?', t)

# Larger example
for t in [('2006-03-28', 'BUY', 'IBM', 1000, 45.00),
          ('2006-04-05', 'BUY', 'MSFT', 1000, 72.00),
          ('2006-04-06', 'SELL', 'IBM', 500, 53.00),
         ]:
    c.execute('insert into stocks values (?,?,?,?,?)', t)
发件人:

您使用的数据库是什么?可能您应该完全避免字符串连接,因为它有引入SQL注入漏洞的风险。扩展@MarkByers注释:这就是Psycopg人所说的合成查询字符串的幼稚方法,例如使用字符串连接-。而是使用查询参数来避免SQL注入攻击,并自动将Python对象与SQL文本进行转换。这是一个很好的解决方案,但它不是我真正想要的。在这个PHP示例中,我喜欢的方法是,对于基于某些数据而变化的复杂查询,很容易遵循逻辑。我更喜欢这个解决方案。谢谢,谢谢!但请确保您正确地转义,否则您可能会有SQL注入。谢谢,我认为您的第二个示例中的转义方法应该足够了?是的!你在使用什么数据库?您可能也对这个讨论感兴趣:我想
f'
而不是
format
也会阻止sql注入?不是都一样吗?
symbol = 'IBM'

# Do this 
t = (symbol,)
c.execute('select * from stocks where symbol=?', t)

# Larger example
for t in [('2006-03-28', 'BUY', 'IBM', 1000, 45.00),
          ('2006-04-05', 'BUY', 'MSFT', 1000, 72.00),
          ('2006-04-06', 'SELL', 'IBM', 500, 53.00),
         ]:
    c.execute('insert into stocks values (?,?,?,?,?)', t)