用于验证和分割CrateDB SQL语句的解析工具。
项目描述
CrateDB SQL解析器用于Python
此软件包提供用于验证和拆分针对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_properties
和parameterized_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 查看散列)
关闭
cratedb_sqlparse-0.0.7.tar.gz的散列
算法 | 散列摘要 | |
---|---|---|
SHA256 | b4699e3a3fcb1b5701bd72d696acdcc1914f4ef00c6981c7aba4b5dcb4bdbc37 |
|
MD5 | deba5fa379065316137d362d4e4e73fe |
|
BLAKE2b-256 | d4403b0eb473e05a3773053e662fac38a9ed77ade1b5d77f665f6879a5ef50c6 |