Вставьте pandas фрейм данных в Postgres - PullRequest
0 голосов
/ 06 января 2020

У меня есть фрейм данных pandas, который я хочу вставить в мою базу данных Postgres в моем проекте Django.

Фрейм данных состоит из 5 столбцов, а таблица базы данных состоит из 6 столбцов и более того, столбцы фрейма данных и порядок столбцов БД не совпадают.

Итак, перед объединением обоих я должен убедиться, что порядок столбцов одинаков как в фрейме данных, так и в таблице БД ? и как, пожалуйста, подскажите, как мне справиться с отсутствующим столбцом

Ответы [ 2 ]

1 голос
/ 06 января 2020

Если dataframe имеет имена столбцов, совпадающие с именами столбцов в базе данных , вы можете вставить df непосредственно в таблицу , используя метод dataframe.to_sql() с помощью sqlalchemy для соединения:

from myapp.models import Bob
from sqlalchemy import create_engine
from django.conf import settings

db_connection_url = "postgresql://{}:{}@{}:{}/{}".format(
    settings.DATABASES['default']['USER'],
    settings.DATABASES['default']['PASSWORD'],
    settings.DATABASES['default']['HOST'],
    settings.DATABASES['default']['PORT'],
    settings.DATABASES['default']['NAME'],
)

engine = create_engine(db_connection_url)

df.to_sql(Bob._meta.db_table, engine, if_exists='append', index=False, chunksize=10000)

Отсутствующий столбец будет пустым (или база данных установит значение по умолчанию, если оно определено на уровне базы данных, а не django уровень), или вы можете добавить отсутствующий столбец в кадр данных с помощью требуемое значение.

0 голосов
/ 06 января 2020

Просто сделайте явную вставку ...

Если в вашей таблице есть столбцы в порядке A, B, C, D, E

Но в Pandas они есть в порядке D, C, B, A (примечание без столбца E)

Просто сгенерируйте SQL вставку как (примечание, у меня нет столбца E)

   insert into <TABLE> (D,C,B,A) values (row_iterator.D,row_iterator.C,...) 

Для столбца E - лучшее и самое простое решение - иметь значение по умолчанию в определении БД ....

т.е.

CREATE TABLE Bob (
    A int NOT NULL,
    B int NOT NULL,
    C int NOT NULL,
    D int NOT NULL,
    E int DEFAULT 42
);

Надеюсь, что поможет

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