【问题标题】:Give a list of strings to a sql-query [Python]将字符串列表提供给 sql-query [Python]
【发布时间】:2016-03-23 12:36:54
【问题描述】:

我在 Windows 7 上使用 Python2.7 和一个 mysql 服务器,通过 pymssql 连接。

我的问题:我有一个非常大的数据库,我喜欢从列表中选择与多个单词(字符串)之一匹配的对象的 ID,然后将其提供给我的程序。 在这个查询中,我列表中的这些单词也必须有一个 LIKE %...% 表达式。

到目前为止,我已将 Python 脚本连接到数据库并定义了一个游标。 然后我用我正在搜索的单词制作了一个小列表,并为稍后的查询创建了一些占位符:

wortliste = ['Bruch', 'Verwerfung']
placeholders = ','.join(['%s'] * len(wortliste))

这是我的查询:

query = """ SELECT BO_INDEX FROM GeoTest.dbo.Tabelle_Bohrung
        WHERE BO_BEMERKUNG IN ({})""".format(placeholders)

当我搜索单个单词时,例如这里的单词“Bruch”,我的查询将如下所示:

query = """ SELECT BO_INDEX FROM GeoTest.dbo.Tabelle_Bohrung
        WHERE BO_BEMERKUNG LIKE '%Bruch%'"""

单个单词的此查询与正确的 Id (=BO_INDEX) 匹配。 带有占位符的查询不会崩溃,但它不匹配任何内容:(

但我喜欢循环我的数据库中的几个单词,并为我的列表中的每个单词(字符串)附加匹配的 ID(=wortliste)并将其附加到一个新列表中。

我真的不知道如何解决这个问题!

我很感激解决这一挑战的每一种新方法! 谢谢!

【问题讨论】:

    标签: python mysql list


    【解决方案1】:

    编辑 2:

    如果您想遍历列表并附加到输出(使用您的示例):

    words = ['ab', 'cd', 'ef']
    abfrage_list = []
    for w in words:
        # Generate a query
        query = """ SELECT BO_INDEX FROM GeoTest.dbo.Tabelle_Bohrung
            WHERE BO_BEMERKUNG LIKE '%%%s%%' """ % w
        # Execute that query and get results
        cur.execute(query)
        result_all = cur.fetchall()
        # Add those results to your final list
        for i in result_all:
            abfrage_list.append(i)
    

    编辑:

    对于您的具有多个likes 的示例:

    query = """ SELECT BO_INDEX FROM GeoTest.dbo.Tabelle_Bohrung
        WHERE BO_BEMERKUNG LIKE '%ab%'
         OR O_BEMERKUNG LIKE '%cd%' 
         OR O_BEMERKUNG LIKE '%ef%' """
    
    query = """ SELECT BO_INDEX FROM GeoTest.dbo.Tabelle_Bohrung
        WHERE {params}""".format(
            params=" OR ".join("BO_BEMERKUNG LIKE '%%%s%%' \n" % w for w in wortliste)
        )
    print(query)
    

    打印:

     SELECT BO_INDEX FROM GeoTest.dbo.Tabelle_Bohrung
        WHERE BO_BEMERKUNG LIKE '%Bruch%' 
     OR BO_BEMERKUNG LIKE '%Verwerfung%' 
    

    您的占位符不包含您的单词列表中的任何项目,请使用:

    placeholders = ','.join("'%s'" % w for w in wortliste)
    

    例如:

    wortliste = ['Bruch', 'Verwerfung']
    print(','.join(['%s'] * len(wortliste)))
    print(','.join("'%s'" % w for w in wortliste))
    

    打印:

    %s,%s
    'Bruch','Verwerfung'
    

    【讨论】:

    • 但我的查询仍然不匹配任何内容,我必须包含 LIKE '%...%' - 表达式,但我不知道这个示例如何。
    • 你知道你想构建什么查询,你能把它添加到问题中吗?也许你想用这个:stackoverflow.com/questions/12957993/…
    • 嗯,这是我程序的第一步。我的列表的内容将与每个新查询一起出现,因此,我想在下一步中将这个列表外包给一个用户,他只输入他在这个外包列表中搜索的单词并运行程序! :)
    • 是的,假设您有一个列表['Bruch', 'Verwerfung'],您希望该列表的 sql 查询是什么样的?
    • query = """ SELECT BO_INDEX FROM GeoTest.dbo.Tabelle_Bohrung WHERE BO_BEMERKUNG LIKE '%Bruch%'""" cur.execute(query) result_all=cur.fetchall() abfrage_list = [] for i in result_all: abfrage_list.append(i) 和我列表中任何其他单词的此过程!
    【解决方案2】:

    对于以下列表的示例 = ['ab','cd','ef']

    query = """ SELECT BO_INDEX FROM GeoTest.dbo.Tabelle_Bohrung
        WHERE BO_BEMERKUNG LIKE '%ab%'
         OR O_BEMERKUNG LIKE '%cd%' 
         OR O_BEMERKUNG LIKE '%ef%' """
    
    cur.execute(query)
    result_all = cur.fetchall()
    
    abfrage_list = []
    for i in result_all:
        abfrage_list.append(i)
    

    但是我需要这个过程来处理这个列表中可能有数百个字符串。 我需要遍历这个列表,并且我需要查询中的 LIKE 表达式,否则它不会捕获任何东西。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-09
      • 2018-10-10
      • 2020-01-21
      • 2020-03-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多