Как преобразовать все заголовки в базе данных PostgreSQL в нижний регистр?

Здравствуйте! В рамках моего проекта я занимаюсь экспортом данных из различных источников и хотел бы внести изменения в код. Нужно преобразовать заголовки таблиц, содержащие заглавные буквы, в прописные. 
<br/> <blockquote>Пример заголовков и данных:  
  ISOCODE     YEAR     XRAT          TCGDP  
    CAN  2001  1.54876   924909.44207  
    CAN  2002  1.56932   957299.91586  
    CAN  2003  1.40105  1016902.00180  
</blockquote> 
<br/> <pre><code class="python">def update_by_id(table, id, key='id', **kwargs):
    # тут необходимо указывать параметры в ковычка "". Это особенность postgres.
    try:
        update('{} SET {} WHERE "{}" = %s'.format(table, ', '.join('"{}" = %s'.format(k) for k in kwargs), key.lower()),
               *(tuple(kwargs.values()) + (id,)))
    except Exception as e:
        print(f"Ошибка обновления записи в таблице {table}: {e}")
        print(f"ID: {id}, Данные: {kwargs}")
        raise</code></pre> 
<br/> В чем заключается моя ошибка?
  • 17 марта 2025 г. 7:54
Ответы на вопрос 2
Чтобы преобразовать все названия столбцов (или заголовки) таблицы в базе данных 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
```

Теперь имена столбцов не будут автоматически конвертироваться в нижний регистр, и вы сможете указать их в нужном регистре.
Postgres формирует колонку id заглавными буквами из-за этого не получатся отредактировать данные
так у тебя ошибка говорит, что нет поля id, соответственно либо у тебя реально нет этого поля, либо это поле у тебя ID, а значит в запросе его надо писать в кавычках "ID", что ты не делаешь

Ну и сразу логи надо текстом всегда показывать, а не картинками, тем более кривыми
Похожие вопросы