Python 从while循环中更改f-string局部变量?
我想使用f字符串查询sqlite数据库,它应该返回一个小的Python 从while循环中更改f-string局部变量?,python,variables,f-string,Python,Variables,F String,我想使用f字符串查询sqlite数据库,它应该返回一个小的描述,给定我存储在局部变量var中的特定id。但是,对于变量的某些值,某些字段将为空。我对值0特别感兴趣,因为它总是返回一个空描述,并且是一个孤立的情况,需要以不同于其他值的方式处理 我想遍历一个范围,直到找到一个非空的描述字段。 以下是一个例子: var = str(self.some_global_variable) # In this case consider var = '0' query = f'my sql query
描述
,给定我存储在局部变量var
中的特定id
。但是,对于变量的某些值,某些字段将为空。我对值0特别感兴趣,因为它总是返回一个空描述,并且是一个孤立的情况,需要以不同于其他值的方式处理
我想遍历一个范围,直到找到一个非空的描述字段。
以下是一个例子:
var = str(self.some_global_variable) # In this case consider var = '0'
query = f'my sql query goes here WHERE this_id={var}'
description = self.function_to_fetch_db(query)
while not description and var == '0':
for i in range (1, 31):
var = str(i)
description = self.function_to_fetch_db(query)
print(description, var)
print(query)
其输出类似于:
[] 1
my sql query goes here WHERE this_id=0
[] 2
my sql query goes here WHERE this_id=0
[] 3
my sql query goes here WHERE this_id=0
.
.
.
局部变量已更新,但查询始终保持while循环外部的原始值
我还尝试了if…else
而不是while
循环,但结果是一样的。
我不认为问题的SQLite部分是相关的,只是为了说明我的具体情况,查询适用于其他值。我只是很难理解这个局部变量和f字符串的关系。你的问题有两个答案:第一个是正式的,第二个是正确的 正式答案是:在您的案例中,字符串在循环之前计算一次。如果希望它针对每个值进行更改,请将其移到内部:
for i in range(31):
query = f'my sql query goes here WHERE this_id={i}'
description = self.function_to_fetch_db(query)
正确答案:改用参数化查询,如下所示:
conn.execute('my sql query goes here WHERE this_id=?', (i,))
(替换语法可能因数据库/驱动程序而异。)您的问题有两个答案:第一个是正式的,第二个是正确的 正式答案是:在您的案例中,字符串在循环之前计算一次。如果希望它针对每个值进行更改,请将其移到内部:
for i in range(31):
query = f'my sql query goes here WHERE this_id={i}'
description = self.function_to_fetch_db(query)
正确答案:改用参数化查询,如下所示:
conn.execute('my sql query goes here WHERE this_id=?', (i,))
(替换语法可能因数据库/驱动程序而异。)您可以在字符串中使用命名变量:
var = str(self.some_global_variable) # In this case consider var = '0'
fquery = 'my sql query goes here WHERE this_id={var}'
description = self.function_to_fetch_db(fquery.format(var=var))
while not description and var == '0':
for i in range(1, 31):
query = fquery.format(var=i)
description = self.function_to_fetch_db(query)
print(description, i)
print(query)
可以在字符串中使用命名变量:
var = str(self.some_global_variable) # In this case consider var = '0'
fquery = 'my sql query goes here WHERE this_id={var}'
description = self.function_to_fetch_db(fquery.format(var=var))
while not description and var == '0':
for i in range(1, 31):
query = fquery.format(var=i)
description = self.function_to_fetch_db(query)
print(description, i)
print(query)
print(query)
是否为每个循环打印不同的查询?另请参见:否,print(query)
将是我的sql查询位于此处,此处id=0
,遵循bereal的建议,将查询移动到循环内,但修复了它,我可以根据发布的链接标记了解原因(很抱歉,在搜索此循环时忽略了这个问题,但现在它确实有意义了。)print(query)
是否为每个循环打印不同的查询?另请参见:否,print(query)
将是我的sql查询在这里,id=0
,遵循bereal的建议,将查询移动到循环中,修复了它,我可以根据发布的链接标记了解原因(抱歉,搜索此链接时忽略了该问题,但现在它确实有意义)。