Чтобы преобразовать все названия столбцов (или заголовки) таблицы в базе данных PostgreSQL в нижний регистр, вам нужно будет выполнить следующие шаги:
1. **Получить список всех столбцов** в таблице.
2. **Создать новую таблицу** с такими же названиями колонок, но в нижнем регистре.
3. **Скопировать данные** из старой таблицы в новую.
4. **Удалить старую таблицу** и переименовать новую.
Вот примерный порядок действий с SQL-запросами:
### Шаг 1: Получение названий столбцов
Вы можете использовать следующий запрос, чтобы получить список названий столбцов:
```sql
SELECT column_name
FROM information_schema.columns
WHERE table_name = 'имя_вашей_таблицы';
```
### Шаг 2 и 3: Создание новой таблицы и копирование данных
Принимая во внимание названия столбцов, вы можете создать новую таблицу с нижним регистром и перенести данные. Пример:
```sql
CREATE TABLE new_table_name (
isocode VARCHAR(255),
year INTEGER,
xrat NUMERIC,
tcgdp NUMERIC
);
INSERT INTO new_table_name (isocode, year, xrat, tcgdp)
SELECT ISOCODE, YEAR, XRAT, TCGDP FROM old_table_name;
```
### Шаг 4: Удаление старой таблицы и переименование
После того как данные были перенесены, вы можете удалить старую таблицу и переименовать новую:
```sql
DROP TABLE old_table_name;
ALTER TABLE new_table_name RENAME TO old_table_name;
```
### Автоматизация с помощью скрипта
Если вам нужно автоматизировать этот процесс для многих таблиц или столбцов, вы можете написать PL/pgSQL функцию или использовать динамический SQL.
### Ошибка в вашем коде
В вашем Python-коде проблема заключается в следующем:
1. Вы используете `key.lower()` для указания имени столбца в условии WHERE. Это корректно, только если вы уверены, что ключ (например, `id`) всегда в верхнем регистре. В PostgreSQL, если вы используете двойные кавычки (как у вас с ключом), регистр будет иметь значение.
2. Вам следует убедиться, что все имена столбцов указаны в правильном регистре в SQL-запросе.
Чтобы исправить код, можно сделать что-то вроде:
```python
def update_by_id(table, id, key='id', **kwargs):
try:
update('{} SET {} WHERE "{}" = %s'.format(table, ', '.join('"{}" = %s'.format(k) for k in kwargs), key),
*(tuple(kwargs.values()) + (id,)))
except Exception as e:
print(f"Ошибка обновления записи в таблице {table}: {e}")
print(f"ID: {id}, Данные: {kwargs}")
raise
```
Теперь имена столбцов не будут автоматически конвертироваться в нижний регистр, и вы сможете указать их в нужном регистре.