将 Python 中的输入文件引用为来自 Java 的转换代码

问题描述 投票:0回答:1

这是我用 Python 完成的第一个任务, 我想将 SQL 查询(不是查询结果,只是查询脚本)转换为 JSON,我正在 python 中搜索一些预构建库,发现很少有像 mo_sql_parsing、sqlparse 这样的库,但没有生成结构化 JSON 并且无法处理复杂的查询。

我找到了一个 java 链接 https://github.com/inzapp/sql-to-json-parser 可以将 SQL 查询转换为 JSON。 所以,我想在 python 中导入 java 代码,py4j 可以帮助解决这个问题。 我正在尝试这个,不确定java代码是一个库并且可以在python中使用。 所以我将 Java 代码转换为 python 并尝试引用一个文件。我在 python 环境中创建了一个 input.txt 文件,并尝试在我的 python 代码中使用它......但是,出现如图所示的错误。

请让我知道实施此操作的正确方法。

下面是我正在尝试的代码

import json
from pathlib import Path

class SqlToJsonParser:
    def __init__(self):
        self.config = {
            "INPUT_FILE_NAME": "input.sql",
            "OUTPUT_FILE_NAME": "output.json",
            "SQL_SYNTAX_ERROR": "SQL syntax error"
        }

    def main(self, args=None):
        input_file_name = self.config["INPUT_FILE_NAME"]
        output_file_name = self.config["OUTPUT_FILE_NAME"]
        if args and len(args) == 2:
            input_file_name = args[0]
            output_file_name = args[1]

        try:
            sql = self.read_sql_from_file(input_file_name)
            if not sql:
                raise Exception("input file does not exist")

            json_data = self.parse(sql)
            if not json_data:
                raise Exception("SQL syntax error")

            self.save_file(json_data, output_file_name)
            print("input sql\n\n", sql)
            print("output json\n\n", json_data)
            print("parse success")
        except Exception as e:
            self.save_file(self.config["SQL_SYNTAX_ERROR"], output_file_name)
            print(e.args[0])

    def parse(self, sql):
        try:
            return json.dumps(self.Parser().parse(sql), indent=4)
        except Exception:
            return None

    def read_sql_from_file(self, file_name):
        try:
            with open(file_name, "r") as file:
                return "\n".join(line.strip() for line in file)
        except FileNotFoundError:
            return None

    def save_file(self, content, file_name):
        try:
            Path(file_name).write_text(content)
        except Exception as e:
            print(e)

    class Parser:
        def parse(self, sql):
            # Implement the parsing logic here
            return {"key": "value"}

if __name__ == "__main__":
    SqlToJsonParser().main(["input.sql", "output.json"])





# import json

# def parse_querystring(query_string):
#     variables = dict()

#     for item in query_string.split('&'):
#         key, value = item.split('=')

#         # if value is an int, parse it
#         if value.isdigit():
#             value = int(value)

#         variables[key] = value

#     return variables


# query_string = 'user=john&uid=10&[email protected]'
# qs = parse_querystring(query_string)

# print(repr(qs))
# print(json.dumps(qs))

python java
1个回答
0
投票

看起来你是Python新手。首先,在中间底部的控制台中,您可以编写错误描述 - “输入文件不存在”。所以这意味着某处文件不存在。

此错误发生在

sql = self.read_sql_from_file(input_file_name)
行,为了检测真正的问题,我建议重构您的代码:

重构技巧

def save_file(self, content, file_name):
    try:
        Path(file_name).write_text(content)
    except Exception as e:
        print(e)

这不是在 pyhton 中处理文件的正确方法,首先你应该像 read_sql_from_file 一样打开,请阅读一些指南,例如 this

它可以在读取或写入文件中,您可以自己捕获它,但是您的错误处理非常糟糕,没有提供任何信息: 在 read_sql_from_file 中(导致下面的代码出错时不执行任何操作)

except Exception:
        return None

尝试修复它以清楚地了解发生在哪里以及发生了什么 - 类似这样

except Exception as e:
        print(f"Save to file failed with err_msg: {e}") 

您的类 Parser 定义为 SqlToJsonParser 属性,这很不寻常 - 您应该重写它,Parser 类定义应该与 SqlToJsonParser 分开完成。

© www.soinside.com 2019 - 2024. All rights reserved.