Utiliser une liste de chaînes dans une clause python MySQL IN avec des paramètres
P粉523335026
P粉523335026 2024-03-27 21:19:06
0
2
424

J'essaie d'utiliser in-query en python. Mais j'ai différentes exceptions à cela.

La première tentative a été :

query = """select keyword
               from keyword 
               where keyword in %(ids)s and country = %(country)s"""
cursor.execute(query, {'ids': tuple(ids), 'country': country})

Il donne l'erreur suivante : Failedprocessing pyformat-parameters; Python“tuple”无法转换为 MySQL 类型

La deuxième tentative était :

str_keywords = ",".join(tuple("'" + str(i) + "'" for i in ids))

query = """select keyword
           from keyword 
           where keyword in (%s) and country = %s"""
cursor.execute(query, (str_keywords, country))

Cela ne donne pas d'erreur mais ne fonctionne pas.

Des suggestions ?

P粉523335026
P粉523335026

répondre à tous(2)
P粉809110129

Vous pouvez utiliser des chaînes f avec des tuples :

ids = ('1,2,3','54','67')
code = 'BR'
query = f"""select keyword
           from keyword 
           where keyword in {ids} and country_code = {code}
           and brand_app is not null"""
query

Sortie :

"select keyword\n           from keyword \n           where keyword in ('1,2,3', '54', '67') and country_code = BR\n           and brand_app is not null"
P粉057869348

Essayez ce qui suit :

params = ",".join(["%s"] * len(ids))
query = f"""select keyword
               from keyword 
               where keyword in ({params}) and country = %s"""
cursor.execute(query, (*ids, country))

L'objectif ici est pour l'espace réservé ids 中的每个值构建一个 in (%s, %s, %s, ..., %s) 子句,其中包含一个 %s.

Il y a quelques points à noter :

  • IN Il peut y avoir une limite supérieure au nombre d'espaces réservés dans une clause. Voir Limites conditionnelles MySQL IN pour plus de détails.
  • Appelé si ids 为空,则此查询无效。您可能已经有一些逻辑来处理空 ids 列表的情况,或者您的代码可能永远不会在 ids est vide. Sinon, vous devrez travailler sur l'affaire.
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal