部门SQL运行器

sql-runner的Python项目详细描述


部门SQL运行器

deptsqlrunner有三个基本功能

  • 按特定顺序执行SQL代码
runner --execute {RUNNER_FILE_1}, {RUNNER_FILE_2} ..
  • 以特定的顺序,在staging模式下执行SQL代码(在测试模式上, 表格和数据)
^{pr2}$
  • 通过临时创建视图快速测试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 Redshift
  • bigquery-用于使用Google BigQuery
  • s3-用于启用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的查询类的源代码。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
JFrame中的Java多线程   java Servlet异常映射   java无法从输出流读取   swing Java带来的小程序GUI问题   java什么原因导致错误“'void'类型此处不允许”以及如何修复它?   Java选择器select(长)与selectNow的区别   java自定义arraylist<mygames>获得不同   java Icepdf注释让页面消失   java反向整数数组   java I在生成同步“无法解析配置的所有依赖项”时遇到此错误:app:debugRuntimeClasspath   多个虚拟机上的java线程访问单个DB实例上的表,有时会导致性能低下和异常   swing更改Java中的默认按钮,使其看起来“更好”   java慢速MQ主题订阅。并行化不能提高性能   java运行Boggle Solver需要一个多小时。我的代码怎么了?   数据库中的java循环与应用程序中的java循环   正则表达式匹配${123…456}并在Java中提取2个数字?   java如何制作我们软件的试用版   Java内存参数计算   从另一个类调用方法时出现java问题