Импорт неструктурированного файла Excel в базу данных
Я должен импортировать данные из файлов Excel в базу данных. Структура этих файлов не совпадает со структурой модели, поэтому я предполагаю, что мне нужно выполнить какие-то манипуляции с данными, чтобы соответствующим образом расположить кортежи.
Файлы, которые я должен импортировать, выглядят так:
Модель django имеет следующие атрибуты: Страна, Товар, Год, Стоимость
Итак, как лучше всего читать данные, упорядочивать их в правильной структуре и импортировать в базу данных (желательно с автоматическим обновлением существующих наборов).
Я потратил много времени на изучение существующих библиотек python и django для этих требований (таких как PyExcel, Pandas, Django-Excel, Django-Import-Export), но я не мог понять, какой из них лучший, и если он поддерживает перестановку данных перед импортом.
Я надеюсь, что вы можете дать мне некоторые рекомендации и решения для этой задачи:)
2 ответа
Хорошо, пара вещей. Обратите внимание, что я не эксперт ни в одном из них.
Во-первых, если ваши данные представляют собой файлы Excel, они структурированы. Природа таблицы заключается в структурировании данных. Неструктурированные данные - это что-то вроде текстового файла или каталога текстовых файлов.
Во-вторых, пожалуйста, прочитайте это и следуйте ему при формулировании вопросов: https://stackru.com/help/mcve
В-третьих, ТАК не здесь, чтобы написать весь ваш код для вас. По вашему вопросу вы еще ничего не попробовали, поэтому ваш вопрос был отклонен.
Помимо преамбулы, вы можете использовать библиотеку панд Python для импорта файлов Excel, манипулирования ими и загрузки их в базы данных SQL.
import pandas as pd
df = pd.read_excel('tmp.xlsx')
df2 = pd.melt(df, id_vars = ['Country', 'Commodity'], var_name = 'Year', value_name = 'Value')
df2
вход:
Country Commodity 2009 2010 2011 2012 2013
0 Austria Com. 1 1 1 1 1 1
1 Austria Com. 2 2 2 2 2 2
2 Belgium Com. 1 3 3 3 3 3
3 France Com. 1 4 4 4 4 4
выход:
Country Commodity Year Value
0 Austria Com. 1 2009 1
1 Austria Com. 2 2009 2
2 Belgium Com. 1 2009 3
3 France Com. 1 2009 4
4 Austria Com. 1 2010 1
Если у вас много файлов Excel, вы можете использовать glob
или же os.walk
перебирать / перебирать каталог и импортировать некоторые или все файлы Excel.
Вы можете использовать панд DataFrame.to_sql
загрузить свои данные в базу данных SQL, которая требует определения соединения с базой данных (адрес сервера, логин / пароль и т. д.).
Это пример для вставки с одним внешним ключом.
models.py
from django.db import models
class Table1(models.Model):
system = models.CharField(max_length=383)
class Table2(models.Model):
name = models.CharField(max_length=383)
system = models.ForeignKey(Table1, blank=True, null=True, on_delete=models.CASCADE)
Вам нужно создать modelResource и переопределить before_import_row для вставки данных в table1. И вы можете изменить имя для полей и создавать таблицы и настроить. 'column_name' - это имя поля в данных Excel, а атрибут - это имя поля в базе данных. А в методе nefore_import вы можете вставлять данные в таблицы и назначать чужие ключи.
И установите ModelResource в класс администратора.
admin.py
from .models import Table1,Table2
from import_export import resources,widgets
from import_export.fields import Field
from django.contrib import admin
class Table2Resource(resources.ModelResource):
name = Field(column_name='name',attribute='name')
system_id = Field(column_name='system', attribute='system_id', widget=widgets.ForeignKeyWidget(Table1))
class Meta:
model = Table2
skip_unchanged = True
fields = ('name','system_id')
def before_import_row(self,row, **kwargs):
value = row['system']
obj = Table1.objects.create(system = value) #create object place
row['system'] = obj.id # update value to id ob new object
@admin.register(Table2)
class Table2Admin(ImportExportModelAdmin,admin.ModelAdmin):
resource_class = Table2Resource
Это все.