跳转到主要内容

用于验证和分割CrateDB SQL语句的解析工具。

项目描述

CrateDB SQL解析器用于Python

License PyPI version PyPI downloads

Tests Test coverage Python versions

Status

此软件包提供用于验证和拆分针对CrateDB特别设计的SQL语句的实用工具。

它基于CrateDB的antlr4语法,确保针对CrateDB的SQL方言进行精确解析。

它从sqlparse中汲取灵感。

安装。

pip install cratedb-sqlparse

使用。

简单示例

from cratedb_sqlparse import sqlparse

query = """
    SELECT * FROM SYS.SHARDS;
    INSERT INTO doc.tbl VALUES (1);
"""
statements = sqlparse(query)

print(len(statements))
# 2

select_query = statements[0]

print(select_query.query)
# 'SELECT * FROM SYS.SHARDS'

print(select_query.type)
# 'SELECT'

print(select_query.tree)
# (statement (query (queryNoWith (queryTerm (querySpec SELECT (selectItem *) FROM (relation (aliasedRelation (relationPrimary (table (qname (ident (unquotedIdent SYS)) . (ident (unquotedIdent (nonReserved SHARDS)))))))))))))

异常和错误。

默认情况下,异常存储在statement.exception

from cratedb_sqlparse import sqlparse

query = """
SELECT COUNT(*) FROM doc.tbl f HERE f.id = 1;

INSERT INTO doc.tbl VALUES (1, 23, 4);
"""
statements = sqlparse(query)
stmt = statements[0]

if stmt.exception:
    print(stmt.exception.error_message)
    # InputMismatchException[line 2:31 mismatched input 'HERE' expecting {<EOF>, ';'}]

    print(stmt.exception.original_query_with_error_marked)
    # SELECT COUNT(*) FROM doc.tbl f HERE f.id = 1;
    #                                ^^^^
    # 
    # INSERT INTO doc.tbl VALUES (1, 23, 4);

    print(stmt.exception.offending_token.text)
    # HERE

在某些情况下,您可能希望sqlparse引发异常。

可以将raise_exception设置为True

from cratedb_sqlparse import sqlparse

sqlparse('SELECT COUNT(*) FROM doc.tbl f WHERE .id = 1;', raise_exception=True)

# cratedb_sqlparse.parser.ParsingException: NoViableAltException[line 1:37 no viable alternative at input 'SELECT COUNT(*) FROM doc.tbl f WHERE .']

捕获异常

from cratedb_sqlparse import sqlparse, ParsingException

try:
    t = sqlparse('SELECT COUNT(*) FROM doc.tbl f WHERE .id = 1;', raise_exception=True)[0]
except ParsingException:
    print('Catched!')

注意

即使您传递了多个语句,它也只会引发它找到的第一个异常。

查询元数据。

可以使用statement.metadata读取查询元数据

from cratedb_sqlparse import sqlparse

stmt = sqlparse("SELECT A, B FROM doc.tbl12")

print(stmt.metadata)
# Metadata(tables=[Table(schema='doc', name='tbl12')], parameterized_properties={}, with_properties={})

查询属性。

WITH语句内定义的属性,statement.metadata.with_properties

from cratedb_sqlparse import sqlparse

stmt = sqlparse("""
    CREATE TABLE doc.tbl12 (A TEXT) WITH (
      "allocation.max_retries" = 5,
      "blocks.metadata" = false
    );
""")[0]

print(stmt.metadata)
# Metadata(tables=[Table(schema='doc', name='tbl12')], with_properties={'allocation.max_retries': '5', 'blocks.metadata': 'false'})

表名

print(stmt.metadata.tables)
# [Table(schema='doc', name='tbl12')]

table = stmt.metadata.tables[0]
print(table.schema, table.name, table.fqn, sep='\n')
# doc
# tbl12
# '"doc"."tbl12"'

参数化属性。

参数化属性是没有实际定义值的属性,用美元字符串标记,metadata.parameterized_properties

from cratedb_sqlparse import sqlparse

stmt = sqlparse("""
    CREATE TABLE doc.tbl12 (A TEXT) WITH (
    "allocation.max_retries" = 5,
    "blocks.metadata" = $1
);
""")[0]

print(stmt.metadata)
# Metadata(tables=[Table(schema='doc', name='tbl12')], parameterized_properties={'blocks.metadata': '$1'}, with_properties={'allocation.max_retries': '5', 'blocks.metadata': '$1'})

在这种情况下,blocks.metadata将同时在with_propertiesparameterized_properties中。

为了被选中,它们需要以美元符号'$'开头,并前面有整数,例如'$1''$123' - '$123abc'是无效的。

开发

设置环境

git clone https://github.com/crate/cratedb-sqlparse

cd cratedb-sqlparse/cratedb_sqlparse_py

python3 -m venv .venv

source .venv/bin/activate

pip install --editable='.[develop,generate,release,test]'

每次再次打开shell时,您都需要运行source .venv/bin/activate以使用poe命令。

运行带有覆盖率的lint和测试。

poe check

仅运行测试

poe test

运行特定的测试。

poe test -k test_sqlparse_collects_exceptions_2

运行lint

poe lint

项目详情


下载文件

下载您平台上的文件。如果您不确定选择哪个,请了解有关安装软件包的更多信息。

源分布

cratedb_sqlparse-0.0.7.tar.gz (140.1 kB 查看散列)

上传时间

构建分布

cratedb_sqlparse-0.0.7-py3-none-any.whl (141.5 kB 查看散列)

上传时间 Python 3

由以下机构支持