将您自己的pandas代码与映射到相同SQL表的Django模型一起使用
我不知道是否有明确支持将pandas数据框写入Django模型的方法。但是,在Django应用程序中,您仍然可以使用自己的代码读取或写入数据库,除了使用ORM(例如通过Django模型)
考虑到您很可能之前已经使用pandas的to_sql
将数据写入数据库,因此您可以继续使用相同的数据库和相同的pandas代码,并简单地创建一个Django模型来访问该表
例如,如果您的pandas代码正在写入SQL表mytable
,只需创建如下模型:
class MyModel(Model):
class Meta:
db_table = 'mytable'
managed = False
field_1 = ...
field_2 = ...
现在,您可以将Django中的此模型与现有的pandas代码(可能在单个Django应用程序中)同时使用。
Django数据库设置
为了使pandas SQL函数读取相同的DB凭据,只需从Django设置中读取字段,例如:
from django.conf import settings
user = settings.DATABASES['default']['USER']
password = settings.DATABASES['default']['PASSWORD']
database_name = settings.DATABASES['default']['NAME']
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)
这种替代方法不被推荐,因为它效率低下
我并没有看到除了逐行读取数据框然后创建模型实例并保存之外的其他方法,而这个方法非常慢。你可能可以通过一些批量插入操作来解决,但是为什么要费事呢?因为 pandas 的 to_sql
已经可以为我们完成这个任务了。当 pandas 可以更快地将 Django 查询集读入数据框时,直接读取 Django 查询集就变得效率低下。
for index, row in df.iterrows():
model = MyModel()
model.field_1 = row['field_1']
model.save()
for record in df_records
。 - Nitin RaturiMyModel
构造函数。 - Courvoisierdf.to_dict(orient="records")
方法并迭代其输出结果比调用df.iterrows()
(慢约 x1.9)或df.itertuples(index=False)
(慢约 x1.1)更快。我使用了%%timeit
进行测试。当然,这可能取决于 DataFrame 的形状和内容,但这可以给你一个大致的顺序。 - scūriolus