【问题标题】:Python Django Import data to PostgresPython Django 将数据导入 Postgres
【发布时间】:2019-08-05 17:38:41
【问题描述】:

我是 Django 新手,想知道如何使用 Django 将 excel/csv/txt 文件中的数据插入 Postgres。我能够成功连接到数据库并创建一个表,但是你们可以帮助我如何使用 Django 模型导入和导出数据

编辑:

csv_filepathname= "C:/Users/Desktop/MF.csv"
djang_proj_folder= "C:/Users/"

import sys,os
sys.path.append(djang_proj_folder)
os.environ['DJANGO_SETTINGS_MODULE'] ='cartel_app.settings'

from cartel_app.models import mf


import csv
datareader = csv.reader(open(csv_filepathname), delimiter='|')

for row in datareader:
    record_type = row[0]
    unique_system_identifier = row[1]
    uls_file_number=row[2]
    ebf_number=row[3]
    call_sign=row[4]
    partition_area_idnumeric=row[5]
    lower_frequency=row[6]
    upper_frequency=row[7]
    def_und_indicator=row[8]
    defined_partition_area=row[9]

成功地将数据加载到表中,但只能加载 2 行,它有 1000 多行,我在哪里做错了?请推荐

【问题讨论】:

    标签: python django python-3.x python-2.7 django-models


    【解决方案1】:

    如果您发布更多详细信息会有所帮助,但我认为这不会改变您采用的方法。例如,您必须从csv(使用native csv reader)/excel(使用openpyxl)导入书籍数据,其中包含title、isbn、page_count等字段。

    首先,我的建议是依赖 django 的 ORM 并创建具有相应字段的模型(书籍)。然后只需读取源文件并做主要工作-插入(出于效率原因,我建议使用bulk_create):

    entries = []
    for line in source:
        entries.append(Book(title=line['title'], ... etc
    Book.objects.bulk_create(entries)
    

    另外,基于模型转储数据,请使用django的built-in capability

    python manage.py dumpdata AppName.ModelName --format json
    

    瞧。希望对你有帮助

    【讨论】:

      【解决方案2】:

      这在很大程度上取决于您的模型,以及在保存之前需要如何处理 csv。

      出于示例目的,我将使用此模型:

      # students/models.py
      from django.db import models
      
      class Student(models.Model):
          first_name = models.CharField(max_length=100)
          last_name = models.CharField(max_length=100)
          grade = models.IntegerField()
      
          def __str__(self):
              return f"{self.first_name} {self.last_name} (grade={self.grade})"
      

      要导入 csv,我们可以使用csv module from the stdlib

      # students/data_import.py
      import csv
      from students.models import Student
      
      def load_csv_file(path):
          with open(path) as file_obj:
              reader = csv.reader(file_obj)
      
              for row in reader:
                  Student.objects.create(
                      first_name=row[0],
                      last_name=row[1],
                      grade=int(row[2]),
                  )
      

      现在,我们可以通过导入格式正确的 csv 来进行测试:

      # There are no products in the database to start
      >>> Student.objects.count()
      0
      
      # Here's a csv with some example data:
      >>> print(open("students.csv").read())
      first_name,last_name,grade
      John,Doe,5
      Jane,Doe,8
      
      >>> from students.data_import import load_csv_file
      >>> load_csv_file("students.csv")
      >>> Student.objects.count()
      2
      >>> Student.objects.values()
      [
          {"first_name": "John", "last_name": "Doe", "grade": 5},
          {"first_name": "Jane", "last_name": "Doe", "grade": 8}
      ]
      

      【讨论】:

      • 我添加了一条新评论,请您检查并告诉我我做错了什么
      • 我修好了。谢谢
      • @BharatGuda 你能解释一下你是如何解决你的问题的,以便未来的访问者了解这个问题以及如何解决它吗?完成后,请选择其中一个回复作为正确答案。
      • 上面的代码对我来说很好,我只需要刷新数据库。加载所有记录需要一些时间。
      猜你喜欢
      • 2020-12-21
      • 1970-01-01
      • 2012-04-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-06
      • 1970-01-01
      • 2016-02-10
      相关资源
      最近更新 更多