目标:在数据库中的所有表上运行checks.yml
,隐式地/动态地(不命名100个表(。
在Soda的快速入门之后,我已经完成了以下部分:
- 安装Soda Core
- 将Soda Core连接到数据源-
configuration.yml
现在我关注写一个检查并运行扫描-checks.yml
。
问题
但是,文档只给出了检查每个表的示例。
4次检查
- 表的总和(在数据库中(
- 列的总和(在数据库中的所有表中(
- 存在表的说明之和
- 存在列描述的总和
查询返回一个COUNT()
。
到目前为止,checks.yml
:
# checks for MY_DATABASE:
sql_metrics:
name: num_tables, num_columns
sum_tables query: |
SELECT COUNT(*)
FROM information_schema.tables
WHERE table_schema = '*';
sum_columns query: |
SELECT COUNT(*)
FROM information_schema.columns
WHERE table_name = '*';
sum_tables_descriptions query: |
-- SQL
sum_columns_descriptions query: |
-- SQL
您的支票文件应该看起来像
checks for MY_DATABASE:
- sum_tables > 0:
sum_tables query: |
SELECT COUNT(*)
FROM information_schema.tables
WHERE table_schema ~~ '%'
- sum_columns > 0:
sum_columns query: |
SELECT COUNT(*)
FROM information_schema.columns
您的检查必须基于文档中尚未提供的条件(待检查或验证(或过滤器。~~的意思是like,%是通配符。尽管条件all和条件no给出相同的结果,所以where子句是不必要的。
Soda Core 3.0.5
Scan summary:
2/2 checks PASSED:
MY_DATABASE in postgres
sum_tables > 0 [PASSED]
sum_columns > 0 [PASSED]
All is good. No failures. No warnings. No errors.
或者,您可以使用此脚本动态创建检查文件,使用带有"for each dataset T:"子句的数据集(表(列表,如:
import psycopg2
import time
#File name with timestamp
filePath = '.'
timestr = time.strftime("%Y-%m-%d-%-H%M%S")
fileName = 'checks-' + timestr + '.yml'
try:
conn = psycopg2.connect("dbname=postgres user=postgres password=yourpassword host=localhost")
cur = conn.cursor()
cur.execute("SELECT ' - '||table_name||'n' FROM information_schema.tables WHERE table_schema = 'public' order by 1 limit 5;")
row = cur.fetchone()
with open(fileName,'w') as f:
line="for each dataset T:n datasets:n"
f.write(line)
while row is not None:
f.write(row[0])
row = cur.fetchone()
cur.close()
line=" checks:n - row_count > 0"
f.write(line)
except (Exception, psycopg2.DatabaseError) as error:
print(error)
finally:
if conn is not None:
conn.close()