Python 将数据帧插入Postgres
我有一个pandas数据框,我想把它插入Django项目中的Postgres数据库 数据框有5列,数据库表有6列,而且数据框列和DB列的顺序不一样Python 将数据帧插入Postgres,python,django,pandas,postgresql,dataframe,Python,Django,Pandas,Postgresql,Dataframe,我有一个pandas数据框,我想把它插入Django项目中的Postgres数据库 数据框有5列,数据库表有6列,而且数据框列和DB列的顺序不一样 因此,在合并两者之前,我是否必须确保数据帧和DB表中的列顺序相同?还有,请建议我如何处理缺少的列只需显式插入 如果表中的列顺序为A、B、C、D、E 但是你的熊猫有D,C,B,A的顺序(注意没有E栏) 只需生成一个SQL插入,如(注意,我没有E列) 希望有帮助如果dataframe的列名与数据库中的列名相同,您可以使用方法将df直接插入数据库表,并借助
因此,在合并两者之前,我是否必须确保数据帧和DB表中的列顺序相同?还有,请建议我如何处理缺少的列只需显式插入 如果表中的列顺序为A、B、C、D、E 但是你的熊猫有D,C,B,A的顺序(注意没有E栏) 只需生成一个SQL插入,如(注意,我没有E列)
希望有帮助如果dataframe的列名与数据库中的列名相同,您可以使用方法将df直接插入数据库表,并借助
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级别定义的),或者您可以使用所需的值将缺少的列添加到dataframe中。如果您在表中插入较少的列,则实际上有,并且您具有松散的约束(列可以为空)然后,其他列应该插入NULL。我认为最好的方法是
pandas.DataFrame.to_csv
-->io.StringIO
-->psycopg2.cursor.copy_to
@aws\u peedient列的顺序如何,这有关系吗?我不明白你在最后一行说的话。最后一行是你可以用来实现这一点的工具,是的,你的数据应该按照插入查询的方式组织
CREATE TABLE Bob (
A int NOT NULL,
B int NOT NULL,
C int NOT NULL,
D int NOT NULL,
E int DEFAULT 42
);
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)