如何检查静态数据库上的内容加载状态?
How to check content loading status on a static database?
我们有一个静态数据库,我们不断使用加载程序脚本进行更新。这些加载程序脚本从第三方来源获取当前信息,对其进行清理并将其上传到数据库。
我已经制作了一些 SQL 脚本来确保存在所需的模式和 table。现在我想检查每个 table 是否具有预期的行数。
我做了这样的事情:
select case when count(*) = <someNumber>
then 'someSchema.someTable OK'
else 'someSchema.someTable BAD row count' end
from someSchema.someTable;
但是进行此类查询约 300 table 秒是很麻烦的。
现在我在想也许有一种方法可以让 table 像:
create table expected_row_count (
schema_name varchar,
table_name varchar,
row_count bigint
);
并以某种方式测试所有列出的 table 和 仅输出 未通过计数检查的那些。但我现在有点想念......我应该尝试编写一个函数吗?像这样的 table 可以用来构建查询并执行它们吗?
全部归功于 @a-horse_with*_no_name ,为了完整性,我发布回复:
检查行数
首先让我们创建一些数据来测试查询:
create schema if not exists data;
create table if not exists data.test1 (nothing int);
create table if not exists data.test2 (nothing int);
insert into data.test1 (nothing)
(select random() from generate_series(1, 28));
insert into data.test2 (nothing)
(select random() from generate_series(1, 55));
create table if not exists public.expected_row_count (
table_schema varchar not null default '',
table_name varchar not null default '',
row_count bigint not null default 0
);
insert into public.expected_row_count (table_schema, table_name, row_count) values
('data', 'test1', (select count(*) from data.test1)),
('data', 'test2', (select count(*) from data.test2))
;
现在查询查询数据:
select * from (
select
table_schema,
table_name,
(xpath('/row/cnt/text()', xml_count))[1]::text::int as row_count
from (
select
table_schema,
table_name,
query_to_xml(format('select count(*) as cnt from %I.%I', table_schema, table_name), false, true, '') as xml_count
from information_schema.tables
where table_schema = 'data' --<< change here for the schema you want
) infs ) as r
inner join expected_row_count erc
on r.table_schema = erc.table_schema
and r.table_name = erc.table_name
and r.row_count != erc.row_count
;
如果所有计数都正常,之前的查询应该给出空结果,并且
tables 如果没有则缺少数据。要检查它,请更新一些
table 在 expected_row_count
上重新 运行 查询。例如:
update expected_row_count set row_count = 666 where table_name = 'test1';
我们有一个静态数据库,我们不断使用加载程序脚本进行更新。这些加载程序脚本从第三方来源获取当前信息,对其进行清理并将其上传到数据库。
我已经制作了一些 SQL 脚本来确保存在所需的模式和 table。现在我想检查每个 table 是否具有预期的行数。
我做了这样的事情:
select case when count(*) = <someNumber>
then 'someSchema.someTable OK'
else 'someSchema.someTable BAD row count' end
from someSchema.someTable;
但是进行此类查询约 300 table 秒是很麻烦的。
现在我在想也许有一种方法可以让 table 像:
create table expected_row_count (
schema_name varchar,
table_name varchar,
row_count bigint
);
并以某种方式测试所有列出的 table 和 仅输出 未通过计数检查的那些。但我现在有点想念......我应该尝试编写一个函数吗?像这样的 table 可以用来构建查询并执行它们吗?
全部归功于 @a-horse_with*_no_name ,为了完整性,我发布回复:
检查行数
首先让我们创建一些数据来测试查询:
create schema if not exists data;
create table if not exists data.test1 (nothing int);
create table if not exists data.test2 (nothing int);
insert into data.test1 (nothing)
(select random() from generate_series(1, 28));
insert into data.test2 (nothing)
(select random() from generate_series(1, 55));
create table if not exists public.expected_row_count (
table_schema varchar not null default '',
table_name varchar not null default '',
row_count bigint not null default 0
);
insert into public.expected_row_count (table_schema, table_name, row_count) values
('data', 'test1', (select count(*) from data.test1)),
('data', 'test2', (select count(*) from data.test2))
;
现在查询查询数据:
select * from (
select
table_schema,
table_name,
(xpath('/row/cnt/text()', xml_count))[1]::text::int as row_count
from (
select
table_schema,
table_name,
query_to_xml(format('select count(*) as cnt from %I.%I', table_schema, table_name), false, true, '') as xml_count
from information_schema.tables
where table_schema = 'data' --<< change here for the schema you want
) infs ) as r
inner join expected_row_count erc
on r.table_schema = erc.table_schema
and r.table_name = erc.table_name
and r.row_count != erc.row_count
;
如果所有计数都正常,之前的查询应该给出空结果,并且
tables 如果没有则缺少数据。要检查它,请更新一些
table 在 expected_row_count
上重新 运行 查询。例如:
update expected_row_count set row_count = 666 where table_name = 'test1';