У меня есть база данных 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, использующий pandas для автоматического импорта файлов .csv в эту таблицу, который работает только в том случае, если я УДАЛЯЮ ТРИГГЕР для обновления материализованного представления перед его запуском.
Если я пытаюсь запустить скрипт без сбросатриггер я получаю следующую ошибку:
sqlalchemy.exc.NotSupportedError: (psycopg2.NotSupportedError) «dohscrape» не является материализованным представлением КОНТЕКСТ: оператор SQL «обновить материализованное представление dohscrape» PL / pgSQLrefresh_matview_dohscrapemat () строка 3 в операторе SQL [SQL: 'INSERT INTO dohscrape (имя файла, содержимое) ЗНАЧЕНИЯ (% (имя файла) s,% (содержимое) s)'] [параметры: ({'имя файла': ... (фон)на эту ошибку по адресу: http://sqlalche.me/e/tw8g)
В нем говорится, что "dohscrape" не материализованное представление, которое является правильным, потому чтоэто имя таблицы, а не материализованное представление.Материализованное представление называется «dohscrapemat».
Ссылка в сообщении об ошибке указывает на следующую информацию:
NotSupportedError Исключение, возникающее в случае использования метода или API базы данных, который являетсяне поддерживается базой данных, например, запрос .rollback () для соединения, которое не поддерживает транзакцию или транзакции отключены.
Эта ошибка является ошибкой 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)
Iиспользую Python 3.7 и Postgres 11.