Django models pandas to_django中的sql:将外键插入数据库
使用pandas to_sql函数时,是否有插入外键的方法? 在将熊猫添加到数据库(postgres)之前,我正在与django的熊猫一起处理上传的Django models pandas to_django中的sql:将外键插入数据库,django-models,foreign-keys,django-database,django-postgresql,pandas-to-sql,Django Models,Foreign Keys,Django Database,Django Postgresql,Pandas To Sql,使用pandas to_sql函数时,是否有插入外键的方法? 在将熊猫添加到数据库(postgres)之前,我正在与django的熊猫一起处理上传的Consultations(n=40k)。我一排一排地做,但那需要15到20分钟。这比我希望我的用户等待的时间要长,所以我正在寻找一个更有效的解决方案 我尝试使用pandas\u sql,但在调用to\u sql函数之前,我不知道如何将两个外键关系作为列添加到我的协商数据帧中。是否有方法将Patient和Praktijk外键添加为咨询数据框中的一列
Consultation
s(n=40k)。我一排一排地做,但那需要15到20分钟。这比我希望我的用户等待的时间要长,所以我正在寻找一个更有效的解决方案
我尝试使用pandas\u sql,但在调用to\u sql
函数之前,我不知道如何将两个外键关系作为列添加到我的协商
数据帧中。是否有方法将Patient和Praktijk外键添加为咨询
数据框中的一列
更具体地说,当逐行插入时,在数据库中创建新的咨询时,我使用类型的对象Patient
或Praktijk
。但是,在数据帧中,我无法使用这些类型,因此不知道如何正确添加外键。是否可能存在类型为object
或int
(患者id)的值,该值可以替换类型为patient的值,从而设置外键
咨询
模式:
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项目以确保两件事:
类Meta
来使用显式名称(django有一种自动命名表的方法)。我将用它来说明
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写成一个表。太糟糕了,所以不支持表的常规降价
尽管如此,我们仍有自己的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支持的并不是您所要求的