从 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)