如何检查静态数据库上的内容加载状态?

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';