【问题标题】:pandas to_sql in django: insert foreign key into DBdjango中的pandas to_sql:将外键插入数据库
【发布时间】:2020-12-01 02:39:51
【问题描述】:

使用pandas to_sql函数时有没有办法插入外键?

我在 django 中处理上传的 Consultations (n=40k) 和 pandas,然后将它们添加到数据库 (postgres)。我逐行完成了这个工作,但这需要 15 到 20 分钟。这比我希望我的用户等待的时间要长,所以我正在寻找更有效的解决方案。

我尝试了 pandas to_sql,但在调用 to_sql 函数之前,我无法弄清楚如何将两个外键关系作为列添加到我的 consultations 数据帧中。有没有办法将 Patient 和 Praktijk 外键添加为 consultations 数据框中的列?

更具体地说,在逐行插入时,在数据库中创建新的咨询时,我使用 type PatientPraktijk 的对象。但是,在数据框中,我不能使用这些类型,因此不知道如何正确添加外键。是否有可能是 objectint(患者的 id?)类型的值可以替代 Patient 类型的值,从而设置外键?

Consultation 模型:

class Consultation(models.Model):
    # the foreign keys
    patient = models.ForeignKey(Patient, on_delete=models.CASCADE, null=True, blank=True)
    praktijk = models.ForeignKey(Praktijk, on_delete=models.CASCADE, default='')

    # other fields which do not give trouble with to_sql
    patient_nr = models.IntegerField(blank=True, null=True)
    # etc

to_sql 电话:

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

如果上述方法不可行,是否有其他更有效解决方案的提示?

【问题讨论】:

    标签: django-models foreign-keys django-database django-postgresql pandas-to-sql


    【解决方案1】:

    我遇到了同样的问题,这就是我解决它的方法。我的回答不是那么直截了当,但我相信它会有所帮助。

    检查您的 django 项目以确定两件事:

    1. 目标表名
    2. 表格列名

    在我的例子中,我在定义 django 模型以使用显式名称时使用class Meta(django 有一种自动命名表的方法)。我将使用django tutorial project 来说明。

    class Question(models.Model):
        question_text = models.CharField(max_length=200)
        pub_date = models.DateTimeField('date published')
        class Meta:
            db_table = "poll_questions"
    
    class Choice(models.Model):
        question = models.ForeignKey(Question, on_delete=models.CASCADE)
        choice_text = models.CharField(max_length=200)
        votes = models.IntegerField(default=0)
        class Meta:
            db_table = "question_choices"
    

    注意:Django 使用 Question 对象的 pk 引用数据库中的 Question 外键。

    假设我有一个问题 pk 1 和一个我希望用来更新问题选择的数据框 df如果使用 pandas 批量插入数据库,我的 df 必须如下所示!

    import pandas as pd  
    
    df = pd.DataFrame(
        {
            "question": [1, 1, 1, 1, 1],
            "choice_text": [
                "First Question",
                "Second Question",
                "Third Question",
                "Fourth Question",
                "Fifth Question"
            ],
            "votes":[5,3,10,1,13]
        }
    )
    
    

    我希望我可以将 df 写成表格。太糟糕了,SO不支持表格的常用降价

    尽管如此,我们的 df 下一步是创建用于插入记录的数据库连接。

    from django.conf import settings
    from sqlalchemy import create_engine
    
    # load database settings from django
    
    user = settings.DATABASES['default']['USER']
    passwd = settings.DATABASES['default']['PASSWORD']
    dbname = settings.DATABASES['default']['NAME']
    
    # create database connection string
    conn = 'postgresql://{user}:{passwd}@localhost:5432/{dbname}'.format(
        user=user,
        passwd=passwd,
        dbname=dbname
    )
    
    # actual database connection object.
    conn = create_engine(conn, echo=False)
    
    # write df into db
    df.to_sql("question_choices", con=conn, if_exists="append", index=False, chunksize=500, method="multi")
    
    

    瞧!
    我们完成了!

    注意:
    django 支持bulk-create,但是,这不是你想要的。

    【讨论】:

      【解决方案2】:

      我在使用 SQLalchemy 时遇到了类似的问题,但我找到了一个简单的解决方法。

      我所做的是使用 SQLalchemy 以我想要的方式定义数据库架构(包含我需要的所有数据类型和外键),然后创建一个空表,然后我只需将 if_exists 参数更改为 append

      这会将所有数据附加到一个空数据库中。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-07-28
        • 2020-10-21
        • 2022-01-09
        • 1970-01-01
        • 2019-05-24
        • 2018-05-12
        • 2018-06-26
        • 2019-01-31
        相关资源
        最近更新 更多