В конце концов, я могу решить эту проблему, изучая 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 все еще не выполняется из-за ограничения символов в столбце БД, и я не уверен, почему .
- Это хороший способ очистки поля валюты от исходных данных?
- Чего мне не хватает на INSERT?
Спасибо вы!