Python / PostgresSQL Обновление значения столбца для ETL - PullRequest
0 голосов
/ 17 апреля 2020

В конце концов, я могу решить эту проблему, изучая python. Буду признателен за любую помощь.

У меня есть функция, которая собирает данные из одной таблицы и загружает их в другую. Однако мне нужно очистить столбец в процессе, чтобы данные соответствовали пределу в 3 символа в столбце таблицы назначения (CurrencyRefFullName)

Вот функция:

    def etl_account(self, last_modified, commit=False):
        with self.qbd_cache_conn().cursor() as cache_cursor:
            self.log.info('account: downloading data')
            cache_cursor.execute(
                """
                SELECT organization, 'qbd', ListID, TimeCreated, TimeModified,
                  Name, FullName, ParentRefListID, AccountType,
                  SpecialAccountType,
                  AccountNumber, "desc", OpenBalance, TotalBalance,
                  CASE
                  WHEN(CurrencyRefFullName = 'US Dollar') THEN null
                  ELSE CurrencyRefFullName
                  END AS currency,
                  IsActive
                FROM Account
                WHERE organization = %s
                  AND TimeModified >= %s
                """, [self.org, last_modified])
            rows = [tuple(row) for row in cache_cursor]
            self.log.info('rows {}'.format(rows))
        self.log.info('account: inserting {} rows'.format(len(rows)))
        with self.acct_conn().cursor() as acct_cursor:
            acct_cursor.execute(
                """
                DELETE FROM account
                WHERE organization = %s
                  AND source_system = 'qbd'
                  AND time_modified >= %s
                """, [self.org, last_modified])
            execute_values(
                acct_cursor, """
                INSERT INTO account (
                  organization, source_system, system_id, time_created,
                  time_modified, name, fully_qualified_name, parent_id,
                  account_type, account_sub_type, account_number, description,
                  opening_balance, current_balance, currency, is_active
                ) VALUES %s
                ON CONFLICT ON CONSTRAINT
                  account_organization_source_system_system_id_key
                DO UPDATE SET
                  time_created = EXCLUDED.time_created,
                  time_modified = EXCLUDED.time_modified,
                  name = EXCLUDED.name,
                  fully_qualified_name = EXCLUDED.fully_qualified_name,
                  parent_id = EXCLUDED.parent_id,
                  account_type = EXCLUDED.account_type,
                  account_sub_type = EXCLUDED.account_sub_type,
                  account_number = EXCLUDED.account_number,
                  description = EXCLUDED.description,
                  opening_balance = EXCLUDED.opening_balance,
                  current_balance = EXCLUDED.current_balance,
                  currency = EXCLUDED.currency,
                  is_active = EXCLUDED.is_active
                """, rows)
            if commit:
                self.acct_conn().commit()

Я просто подумал Хорошим решением будет добавление оператора CASE к первому оператору SELECT, чтобы исправить столбец без необходимости повторения. Вывод журнала rows показывает, что это похоже на работу, поскольку он показывает как None для этого столбца.

Однако INSERT все еще не выполняется из-за ограничения символов в столбце БД, и я не уверен, почему .

  1. Это хороший способ очистки поля валюты от исходных данных?
  2. Чего мне не хватает на INSERT?

Спасибо вы!

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