如何将Pandas Dataframe写入Django模型

发布于 2021-01-29 17:06:12

我一直在使用python中的pandas,通常将数据帧写入数据库表,如下所示。我现在正在迁移到Django,如何通过称为MyModel的模型将相同的数据帧写入表中?援助真的很感激。

# Original pandas code
    engine = create_engine('postgresql://myuser:mypassword@localhost:5432/mydb', echo=False)
    mydataframe.to_sql('mytable', engine,if_exists='append',index=True)
关注者
0
被浏览
309
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    在映射到同一SQL表的Django模型旁边使用自己的熊猫代码

    我不知道将熊猫数据框写入Django模型的任何明确支持。但是,在Django应用中,除了使用ORM(例如通过Django模型)之外,您仍然可以使用自己的代码来读取或写入数据库。

    鉴于您极有可能在数据库中以前是由pandas’编写的to_sql,因此您可以继续使用相同的数据库和相同的pandas代码,只需创建一个可以访问该表Django模型即可

    例如,如果您的熊猫代码正在写入SQL表mytable,则只需创建一个如下模型:

    class MyModel(Model):
        class Meta:
            db_table = 'mytable' # This tells Django where the SQL table is
            managed = False # Use this if table already exists
                            # and doesn't need to be managed by Django
    
        field_1 = ...
        field_2 = ...
    

    现在,您可以将Django中的该模型与现有的熊猫代码同时使用(可能在单个Django应用中)

    Django数据库设置

    要将相同的DB凭据获取到pandas SQL函数中,只需从Django设置中读取字段,例如:

    from django.conf import settings
    
    user = settings.DATABASES['default']['USER']
    password = settings.DATABASES['default']['PASSWORD']
    database_name = settings.DATABASES['default']['NAME']
    # host = settings.DATABASES['default']['HOST']
    # port = settings.DATABASES['default']['PORT']
    
    database_url = 'postgresql://{user}:{password}@localhost:5432/{database_name}'.format(
        user=user,
        password=password,
        database_name=database_name,
    )
    
    engine = create_engine(database_url, echo=False)
    

    不建议使用替代方法,因为它效率低下

    除了逐行读取数据框然后创建模型实例并保存它,我真的看不到什么方法,这确实很慢。您可能不愿进行一些批处理插入操作,但是既然熊猫to_sql已经为我们做到了,为什么还要打扰呢。当熊猫也可以更快地将Django查询集读取到熊猫数据框中时,这样做效率低下。

    # Doing it like this is slow
    for index, row in df.iterrows():
         model = MyModel()
         model.field_1 = row['field_1']
         model.save()
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看