我不知道将熊猫数据框写入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应用中)
要将相同的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()