【问题标题】:How to loop through multiple queries seperated by ; in the python如何遍历由 ; 分隔的多个查询在蟒蛇
【发布时间】:2023-01-22 15:57:45
【问题描述】:

我正在编写一个 python 代码,它将读取目录中的多个文件并检查这些文件中的所有查询。该代码将执行两项检查:

  1. 它将检查 CREATE TABLE 查询中的表名是否包含在双引号中,如果是则发出警告,并且
  2. 它将检查 CREATE 语句中的任何列名是否为预定义名称,例如 CURRENT_DATE、CURRENT_ROLE、CURRENT_TIME、CURRENT_TIMESTAMP 和 CURRENT_USER,如果是则给出错误。

    然而,当前代码似乎只适用于一个查询,即使在输入文档中提供了多个查询。任何人都可以帮我修改代码,以便它可以处理输入文档中由“;”分隔的多个查询

    import os
    import xlsxwriter
    import sqlparse
    
    def get_value():
        file_directory = input("Enter file directory: ")
        output_directory = file_directory
        wb = xlsxwriter.Workbook(output_directory + '\Summary of code.xlsx')
        summary_sheet = wb.add_worksheet('Summary')
        row = 1
        column = 0
        index = 0
        predefined_column_names = ["CURRENT_DATE", "CURRENT_ROLE", "CURRENT_TIME", "CURRENT_TIMESTAMP", "CURRENT_USER"]
        for filename in os.listdir(file_directory):
            filepath = os.path.join(file_directory, filename)
            with open(filepath, 'r') as f:
                sf_file = f.read()
            parsed_sql = sqlparse.split(sf_file)
            for i, statement in enumerate(parsed_sql):
                if statement.strip().upper().startswith("CREATE TABLE"):
                    if "\"" in statement:
                        table_name = statement.split()[2]
                        if table_name.startswith("\"") and table_name.endswith("\""):
                            print(f"{filename} sqlcode{i+1} Warning: Table Name should not be enclosed in double quotes")
                            summary_sheet.write(row, column, filename)
                            summary_sheet.write(row, column+1, f'sqlcode{i+1}')
                            summary_sheet.write(row, column+2, statement)
                            summary_sheet.write(row, column+3, "Warning: Table Name should not be enclosed in double quotes")
                            row += 1
                    for col_name in predefined_column_names:
                        if col_name in statement.upper():
                            print(f"{filename} sqlcode{i+1} Error: Column name '{col_name}' cannot be a predefined name")
                            summary_sheet.write(row, column, filename)
                            summary_sheet.write(row, column+1, f'sqlcode{i+1}')
                            summary_sheet.write(row, column+2, statement)
                            summary_sheet.write(row, column+3, f"Error: Column name '{col_name}' cannot be a predefined name")
                            row += 1
        wb.close()
        print("Check Completed")
    
    get_value()
    
    

    我正在编写一个 python 代码,它将读取目录中的多个文件并检查这些文件中的所有查询。该代码将执行两项检查:

    1. 它将检查 CREATE TABLE 查询中的表名是否包含在双引号中,如果是则发出警告,并且
    2. 它将检查 CREATE 语句中的任何列名是否为预定义名称,例如 CURRENT_DATE、CURRENT_ROLE、CURRENT_TIME、CURRENT_TIMESTAMP 和 CURRENT_USER,如果是则给出错误。

      然而,当前代码似乎只适用于一个查询,即使在输入文档中提供了多个查询。任何人都可以帮我修改代码,以便它可以处理输入文档中由“;”分隔的多个查询吗?

【问题讨论】:

    标签: python sql python-3.x loops sql-parser


    【解决方案1】:

    在 Python 中,您可以使用 for 循环遍历以分号 (;) 分隔的查询列表。以下是如何执行此操作的示例:

    queries = "SELECT * FROM table1; SELECT * FROM table2; SELECT * FROM table3" query_list = queries.split(";")

    对于查询列表中的查询: 查询 = query.strip() # 在这里执行查询(例如使用数据库库) 打印(查询)

    在此示例中,字符串查询包含多个以分号分隔的查询。 split() 方法用于将字符串拆分为单个查询列表,这些查询存储在 query_list 变量中。然后 for 循环遍历列表中的每个查询,并且 strip() 方法用于从查询中删除任何前导或尾随空格。最后,可以执行查询(例如使用数据库库)。

    您还可以使用 python 的 re 库来使用正则表达式拆分查询;

    重新进口 queries = "SELECT * FROM table1; SELECT * FROM table2; SELECT * FROM table3" query_list = re.split(r";s*", 查询)

    对于查询列表中的查询: # 在这里执行查询(例如使用数据库库) 打印(查询)

    这样就可以循环遍历python中以分号(;)分隔的多个查询

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-05
      • 1970-01-01
      • 1970-01-01
      • 2022-10-06
      • 1970-01-01
      • 2014-05-23
      • 2020-11-04
      • 1970-01-01
      相关资源
      最近更新 更多