从 while 循环更改 f 字符串局部变量?
Change f-string local variable from a while loop?
我想使用 f 字符串查询 sqlite 数据库,它应该 return 一个小的 description
给定一个特定的 id
我存储在一个局部变量 var
。但是,对于变量的某些值,某些字段将为空。我对值 0 特别感兴趣,它总是 return 一个空的描述,并且是一个孤立的案例,需要与其他值不同地处理。
我想遍历一个范围,直到找到一个非空的描述字段。
这是一个例子:
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,))
(替换语法可能因您的数据库/驱动程序而异。)
您可以在字符串中使用命名变量:
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)
我想使用 f 字符串查询 sqlite 数据库,它应该 return 一个小的 description
给定一个特定的 id
我存储在一个局部变量 var
。但是,对于变量的某些值,某些字段将为空。我对值 0 特别感兴趣,它总是 return 一个空的描述,并且是一个孤立的案例,需要与其他值不同地处理。
我想遍历一个范围,直到找到一个非空的描述字段。 这是一个例子:
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,))
(替换语法可能因您的数据库/驱动程序而异。)
您可以在字符串中使用命名变量:
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)