在映射到同一个 SQL 表的 Django 模型旁边使用您自己的 pandas 代码
我不知道有任何明确支持将 pandas 数据帧写入 Django 模型。但是,在 Django 应用程序中,除了使用 ORM(例如通过您的 Django 模型)之外,您仍然可以使用自己的代码来读取或写入数据库
鉴于您很可能在以前由 pandas 的 to_sql 编写的数据库中有数据,您可以继续使用相同的数据库和相同的 pandas 代码,只需创建一个 Django model that can access that table
例如如果你的 pandas 代码正在写入 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 中将此模型与您现有的 pandas 代码同时使用(可能在单个 Django 应用中)
Django 数据库设置
要在 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)
不推荐使用替代方法,因为它效率低下
除了逐行读取数据帧然后创建模型实例并保存它之外,我真的没有看到其他方法,这真的很慢。您可能会摆脱一些批量插入操作,但既然 pandas 的 to_sql 已经为我们做了这件事,为什么还要麻烦呢。将 Django 查询集读入 pandas 数据帧只是效率低下,而 pandas 也能为我们更快地做到这一点。
# Doing it like this is slow
for index, row in df.iterrows():
model = MyModel()
model.field_1 = row['field_1']
model.save()