gpt4 book ai didi

django-models - django 中的 Pandas to_sql : insert foreign key into DB

转载 作者:行者123 更新时间:2023-12-04 15:20:48 30 4
gpt4 key购买 nike

使用pandas to_sql函数时有没有办法插入外键?
我正在处理上传Consultation s (n=40k) 在 django 中使用 Pandas ,然后将它们添加到数据库 (postgres)。我一行一行地工作,但这需要 15 到 20 分钟。这比我希望我的用户等待的时间要长,所以我正在寻找更有效的解决方案。
我试过pandas to_sql,但我不知道如何将两个外键关系作为列添加到我的consultations调用 to_sql 之前的数据帧功能。有没有办法将 Patient 和 Praktijk 外键添加为 consultations 中的列数据框?
更具体地说,当逐行插入时,我使用 的对象。类型 PatientPraktijk在数据库中创建新咨询时。但是,在数据帧中,我不能使用这些类型,因此不知道如何正确添加外键。是否可能存在类型为 object 的值?或 int (患者的 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 项目以确保两件事:

  • 目标表名
  • 表列名称

  • 就我而言,我使用 class Meta在定义 django 模型时使用显式名称(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 使用 在数据库中引用问题外键pk 的问题对象。
    假设我有一个问题 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 写成一个表格。太糟糕了,所以不支持通常的表格 Markdown
    尽管如此,我们的 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然而,这不是你所要求的。

    关于django-models - django 中的 Pandas to_sql : insert foreign key into DB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63358036/

    30 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com