Сценарий Python для импорта .csv to_sql с помощью Pandas завершится неудачно, если я не уроню TRIGGER для обновления материализованного представления - PullRequest
0 голосов
/ 31 января 2019

У меня есть база данных 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.

1 Ответ

0 голосов
/ 31 января 2019

В нем говорится, что «dohscrape» не является материализованным представлением, что является правильным, поскольку это имя таблицы, а не материализованное представление.Материализованное представление называется «dohscrapemat».

Таким образом, ваша триггерная функция явно неверна.Заменить

    refresh materialized view dohscrape; -- error

на

    refresh materialized view dohscrapemat;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...