部门SQL运行器
sql-runner的Python项目详细描述
部门SQL运行器
deptsqlrunner有三个基本功能
- 按特定顺序执行SQL代码
runner --execute {RUNNER_FILE_1}, {RUNNER_FILE_2} ..
- 以特定的顺序,在staging模式下执行SQL代码(在测试模式上, 表格和数据)
- 通过临时创建视图快速测试SQL代码
runner --test {RUNNER_FILE_1}, {RUNNER_FILE_2} ..
- 依赖关系图的绘制
runner --deps
runner
命令的别名是sqlrunner
,用于遗留用途。在
使用run_sql
将在交互模式下运行。run_sql /path/to/config.json
支持的数据库有Redshift、Snowflake和Postgres。在
安装
SQL Runner具有以下可选依赖项,在使用pip进行安装过程中,必须在需要时提及这些依赖项:
azuredwh
-用于使用azuresql数据仓库snowflake
-用于处理雪花数据库redshift
-用于使用AWS Redshiftbigquery
-用于使用Google BigQuerys3
-用于启用aws3api访问(用于保存依赖关系SVG-graph)
另外,对于azuredwh,还需要安装Microsoft ODBC Driver。对于Ubuntu 18.04,这已经足够了:
# In case any of these gest stuck, simply run `sudo su` once, to cache the password, then exit using Ctrl+D curl https://packages.microsoft.com/keys/microsoft.asc | sudo apt-key add - curl https://packages.microsoft.com/config/ubuntu/18.04/prod.list | sudo tee /etc/apt/sources.list.d/mssql-release.list > /dev/null sudo apt-get update sudo ACCEPT_EULA=Y apt-get install msodbcsql17 sudo apt-get install unixodbc-dev
另一个依赖项是graphviz:
sudo apt install graphviz
强烈建议将其安装在虚拟环境中。在
要创建虚拟环境,请运行以下命令:
sudo apt-get install python3-virtualenv python3 -m virtualenv -p python3 venv
要在虚拟环境中安装,请运行以下命令:
source venv/bin/activate # Install with dependencies, ex. s3 and azuredwh pip install git+https://github.com/leroi-marketing/sql-runner.git#egg=sql-runner[azuredwh]# Or install from pypi pip install sql-runner[azuredwh]
但如果您真的想在全球范围内安装,请运行以下命令:
sudo apt install python3-pip # Install with dependencies, ex. s3 and azuredwh sudo pip install git+https://github.com/leroi-marketing/sql-runner.git#egg=sql-runner[azuredwh]# Or install from pypi pip install sql-runner[azuredwh]
配置
使用sqlrunner需要两个配置文件。在
- A配置.json指定所有必需的配置变量的文件。默认路径是
auth/config.json
相对于运行该路径的目录。在
{
"sql_path": "{PATH}",
"database_type": "[snowflake|redshift|postgres|bigquery|azuredwh]",
"auth": {
// For Azure Synapse Analytics only
"server": "url.of.azuredwh.server",
// for BigQuery only
"credentials_path": "/path/to/google-generated-credentials.json",
// for Snowflake only
"account": "{SNOWFLAKE_ACCOUNT}",
// Azure Synapse Analytics DB, or Snowflake DB, or BigQuery Project ID
"database": "{DATABASE}",
// Postgresql or Redshift
"dbname": "{POSTGRES_DATABASE} OR {REDSHIFT_DATABASE}",
"host": "{POSTGRES_HOSTNAME} OR {REDSHIFT_HOSTNAME}",
"port": "{POSTGRES_PORT} OR {REDSHIFT_PORT}"
// Snowflake, postgres, redshift
"user": "{USERNAME}",
// Azure Synapse Analytics
"username": "{USERNAME}",
// All except Google BigQuery
"password": "{PASSWORD}",
},
// configure staging environments as database suffix for all but the source data objects
"staging": {
"override": {
"database": {
"suffix": "_STAGING1"
}
},
// python3 code that exposes `re` - regular expressions module, `database`, `schema`, `relation` being referenced
"except": "not re.match('dwh', database.lower()) or re.search('^x', schema)"
},
// configure test schema creation locations as a schema prefix for all but the source data objects
"test": {
"override": {
"schema": {
"prefix": "zz_"
}
},
// python3 code that exposes `re` - regular expressions module, `database`, `schema`, `relation` being referenced
"except": "not re.match('dwh', database.lower()) or re.search('^x', schema)"
},
// Add a dependency cache file, to speed up run initialization
"deps_cache": {
"type": "filesystem",
"location": "/path/to/local/cache/dependencies.csv"
},
"deps_schema": "{DEPENDENCY_SCHEMA_NAME}",
"exclude_dependencies": [
"EXCLUDED_SCHEMA_1",
"EXCLUDED_SCHEMA_2"
],
"graphviz_path": "{GRAPHVIZ_PATH_FOR_WINDOWS}"
}
另外,还可以提供包含在sqlrunner中的Python脚本的路径。对于每个JSON主属性,脚本必须有一个带有静态值成员的Config
或@property
成员的类。简短、不充分的例子:
classConfig:sql_path="sql"database_type="snowflake"explicit_database=Truetest={"override":{"schema":{"prefix":"zz_"}},"except":"re.search('^x', schema)"}@propertydefauth(self):# Retrieve credentials from somewherereturn{"user":"DEPT","password":"123456","database":"DWH","account":"db"}if__name__=='__main__':importjsonconfig={}config_obj=Config()forkeyindir(config_obj):ifnotkey.startswith('__'):config[key]=getattr(config_obj,key)print(json.dumps(config,indent=4))
此功能允许以加密状态存储敏感凭据
- 一个或多个csv文件,指定表和视图的名称及其各自的架构。在
{SCHEMA_1};{SQL_FILENAME_1};e
{SCHEMA_1};{SQL_FILENAME_2};e
{SCHEMA_1};{SQL_FILENAME_3};e
{SCHEMA_2};{SQL_FILENAME_4};e
{SCHEMA_3};{SQL_FILENAME_5};e
..
每个架构需要一个目录。SQL文件的名称应与相应表或视图的名称相对应。最后一列指定所需的操作。在
e: execute the query
t: create table
v: create view
m: materialize view
check: run assertions on query result
开发
要在本地设置依赖项以进行开发,请执行以下操作:
# Install virtualenv (if your default python is python2, specify also `-p python3`) python3 -m virtualenv -p python3 venv source venv/bin/activate pip install -e .[azuredwh]# and other optional dependencies# Run local (non-build) version: python debug.py [arg1 arg2 ...]
功能注释
查询顶部可以有功能注释。这些注释可以指定azuresynapse Analytics或RedShift的数据分布,也可以包含check
查询的断言。在
检查查询
在sql文件顶部添加功能注释,格式如下:
/*assert_row_count 0*/SELECT1FROMmy_schema.my_tableWHERErevenue<0;
如果返回的行与预期不符,则提供一个选项,使步骤综合失败。目前支持2个测试,但可以轻松扩展:
assert_row_count <x>
-如果语句返回的行数与x
不同,则失败assert_almost_equal <tolerance value>
-如果以单列返回的2行的值彼此相差超过tolerance value
,则失败
{a2要添加更多测试^
重写依赖项
有时您只想更新一个表,而不是重新创建它。这需要一个execute
类型的查询,UPDATE
本身没有被依赖性检测器很好地解析。对于这种情况,以及依赖性检测对服务不起作用的其他情况,您可以使用这些功能性注释来帮助它。在
在SQL语句的任何位置,添加一个具有有效JSON的注释。当前支持以下JSON密钥:
"node_id": ["my_schema", "my_table"]
-重写查询列表CSV和文件名中的名称。这让你在同一个表上有多个步骤"override_dependencies": [["my_schema", "mytable1"], ["my_schema", "mytable2"]]
-告诉依赖关系解析器在检测依赖关系时完全忽略查询,并且只接受这些查询"ignore_dependencies": [["my_schema", "mytable1"], ["my_schema", "mytable2"]]
-告诉依赖关系分析器忽略查询中检测到的依赖项列表。在"additional_dependencies": [["my_schema", "mytable1"], ["my_schema", "mytable2"]]
-告诉依赖关系解析器在已检测到的依赖项之上还包括一个显式依赖项列表。在
这需要更好的文档,但是现在您可以在sqlrunner/DB中检查特定于DB的查询类的源代码。
- 项目
标签: