使用Pandas导入.csv到_sql的Python脚本失败,除非我为更新物化视图而DROP TRIGGER



我有一个Postgres数据库,其中有一个带有物化视图的表,每次通过以下用户定义的函数和触发器对表进行更改时,该表都会自动更新:

create function refresh_matview_dohscrapemat()
returns trigger language plpgsql
as $$
begin
refresh materialized view dohscrape;
return null;
end $$;
create trigger refresh_matview_dohscrapemat
after insert or update or delete or truncate
on dohscrape for each statement
execute procedure refresh_matview_dohscrapemat();

我有一个python脚本,它使用panda自动将.csv文件导入此表,只有在运行前删除用于更新物化视图的TRIGGER时才有效。

如果我试图在不删除触发器的情况下运行脚本,我会得到以下错误:

sqlalchemy.exc.NotSupportedError:(psycopg2.NotSupportedError)"dohscraft"不是物化视图上下文:SQL语句"刷新物化视图dohscraft"PL/pgSQL函数SQL语句[SQL:'INSERT处的refresh_matview_dohscrapemat()第3行INTO dohs强奸(文件名,内容)VALUES(%(文件名)s,%(content)s)'][parameters:({'filename':…(此错误的背景地点:http://sqlalche.me/e/tw8g)

它说"dohscraft"不是一个物化视图,这是正确的,因为这是表的名称,而不是物化视图。物化视图被命名为"dohscrapemat"。

错误消息中的链接指向以下信息:

NotSupportedError在方法或数据库API的情况下引发异常使用了数据库不支持的,例如请求对不支持事务或具有交易关闭。

此错误是DBAPI错误,源于数据库驱动程序(DBAPI),而不是SQLAlchemy本身。

但我不知道这与更新物化视图的触发器引起的错误有何关系,我认为这是根本问题,因为删除它可以解决错误。

一旦我让脚本上传到表中并重新创建触发器,一切都很好,但我希望能够运行这个脚本,而不必删除和重新创建触发器。

为什么刷新物化视图的触发器会导致导入错误?为什么pandas/sqlalchemy/psycopg2混淆了我的表和它的物化视图

上传到数据库的python脚本中的代码片段是:

for files in source:
if files.endswith(".csv"):
df = pd.read_csv(os.path.join(sourcepath,files))
df.to_sql(name='dohscrape',con=dbconn,if_exists='append',index=False)

我使用的是Python 3.7和Postgres 11。

它说"dohscraft"不是一个物化视图,这是正确的,因为这是表的名称,而不是物化视图。物化视图被命名为"dohscrapemat"。

所以您的触发器函数显然是错误的。更换

refresh materialized view dohscrape; -- error

带有

refresh materialized view dohscrapemat;

最新更新