Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » Django
  • » Предотвращение повторной записи данных в БД. [RSS Feed]

#1 Янв. 1, 2012 16:11:08

Infernion
От:
Зарегистрирован: 2011-12-29
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Предотвращение повторной записи данных в БД.

Имеется парсер который берет инфу из student.xls и записывает его в БД. Но при каждом обращении запись происходит по новому. Как сделать что бы записывало только новые данные?

parsel.py:

#-*- coding: utf-8 -*-
from django.db import models
from db.models import Student
import operator
import datetime
import xlrd
import sys

def get_parse(students):
rb = xlrd.open_workbook('students.xls', formatting_info=True)
sheet = rb.sheet_by_index(0)

data = [] # Переменная для последующей записивсех данных в "кучу"

for rownum in range(sheet.nrows):
row = sheet.row_values(rownum)
# row[0] - Первая колонка - здесь фамилия
# row[1] - Имя
# row[...] - ...
last_name = row[0]
first_name = row[1]
middle_name = row[2]
group = row[3]
tel = row[4]
tel_parents = row[5]
email = row[6]
website = row[7]
adress = row[8]
city = row[9]
state = row[10]

# Проверяем, если first_name - "Фамилия"" - значит это заголовок таблицы, эти данные не записываем.
# Можно еще первую итерацию просто отсеять.
if last_name == u'Прізвище':
continue # Пропускаем иттерацию цикла - переходим сразу к следующей

# Записываем данные словарем в переменную для удобств
data.append({
'last_name': last_name,
'first_name': first_name,
'middle_name': middle_name,
'group': group,
'tel': tel,
'tel_parents': tel_parents,
'email': email,
'website': website,
'adress': adress,
'city': city,
'state': state,
})

return data

# Теперь где угодно и куда угодно можем вставить\вывести полученные данные в удобном виде
#Сохранение в БД, проинтегрированое.
for data in get_parse('students.xls'):
put_in_db = Student(first_name= data['first_name'], last_name= data['last_name'], middle_name= data['middle_name'], group= data['group'], tel= int(data['tel']), tel_parents= data['tel_parents'], email= data['email'], website= data['website'], adress= data['adress'], city= data['city'], state= data['state'])
put_in_db.save()
#Вывод результата, для наглядности
print Student.objects.all()



Отредактировано (Янв. 5, 2012 13:50:28)

Офлайн

#2 Янв. 5, 2012 11:15:37

Infernion
От:
Зарегистрирован: 2011-12-29
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Предотвращение повторной записи данных в БД.

Что никто не подскажет? Нужно то все го сделать проверку если там подобное или нет. Когда пишу:

if last_name == Student.objects.all():
continue
Оно не хочет выбирать. Как сделать правильно?



Отредактировано (Янв. 5, 2012 13:51:04)

Офлайн

#3 Янв. 5, 2012 11:52:19

Piton23
От:
Зарегистрирован: 2011-10-17
Сообщения: 139
Репутация: +  5  -
Профиль   Отправить e-mail  

Предотвращение повторной записи данных в БД.

Student это самонаписанный класс модели? Не знаю как реализован метод save у вас и в каком типе переменных хранится список студентов в классе Sudent.

Раз вы записываете в базу, то не легче ли при записи в базу проверять есть ли там данная запись студента, если есть то пропускать.

Есть множество, по сравнению с словарем он содержит только уникальные значения, мб в эту сторону копать. Кароче больше информации от вас нужно, я по крайней мере не могу сходу так сказать (предугадать) что у вас там, мб другие кто то смогут помочь больше

Офлайн

#4 Янв. 5, 2012 12:16:14

Infernion
От:
Зарегистрирован: 2011-12-29
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Предотвращение повторной записи данных в БД.

Piton23
Раз вы записываете в базу, то не легче ли при записи в базу проверять есть ли там данная запись студента, если есть то пропускать.
Ну в принципе я так и делал.

Studen это модель, она хранится в db когда в конце операции пишу
print Student.objects.all()
Все выводит на экран.

UPD.
Или еще вариант, сделать что бы данные заводились не INSERT a UPDATE. БД PostgreSQL, не подскажете реализацию?



Отредактировано (Янв. 5, 2012 13:51:47)

Офлайн

#5 Янв. 5, 2012 15:09:18

Sergei
От:
Зарегистрирован: 2011-10-04
Сообщения: 29
Репутация: +  4  -
Профиль   Отправить e-mail  

Предотвращение повторной записи данных в БД.

https://docs.djangoproject.com/en/1.3/ref/models/querysets/
раздел про get_or_create прочтите.



Офлайн

#6 Янв. 5, 2012 17:10:52

Infernion
От:
Зарегистрирован: 2011-12-29
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Предотвращение повторной записи данных в БД.

Sergei
https://docs.djangoproject.com/en/1.3/r … querysets/
раздел про get_or_create прочтите.
Спасибо, почитал документацию, понял как происходит выбор команд INSERT и UPDATE.
Вот работоспособный код, может кому то пригодится.
#-*- coding: utf-8 -*-
from django.db import connection, models
from db.models import Student
import operator
import datetime
import xlrd
import sys

def get_parse(students):
rb = xlrd.open_workbook('students.xls', formatting_info=True)
sheet = rb.sheet_by_index(0)

data = [] # Переменная для последующей записивсех данных в "кучу"

for rownum in range(sheet.nrows):
row = sheet.row_values(rownum)
# row[0] - Первая колонка - здесь id колонки, из-за этого происходит обновление.
# row[1] - Фамилия
# row[...] - ...
id = row[0]
last_name = row[1]
first_name = row[2]
middle_name = row[3]
group = row[4]
tel = row[5]
tel_parents = row[6]
email = row[7]
website = row[8]
adress = row[9]
city = row[10]
state = row[11]

# Проверяем, если first_name - "Фамилия"" - значит это заголовок таблицы, эти данные не записываем.
# Можно еще первую итерацию просто отсеять.
if last_name == u'Прізвище':
continue # Пропускаем иттерацию цикла - переходим сразу к следующей

# Записываем данные словарем в переменную для удобств
data.append({
'id': id,
'last_name': last_name,
'first_name': first_name,
'middle_name': middle_name,
'group': group,
'tel': tel,
'tel_parents': tel_parents,
'email': email,
'website': website,
'adress': adress,
'city': city,
'state': state,
})

return data

# Теперь где угодно и куда угодно можем вставить\вывести полученные данные в удобном виде
#Сохранение в БД, проинтегрированое.
for data in get_parse('students.xls'):
put_in_db = Student(id= data['id'], first_name= data['first_name'], last_name= data['last_name'], middle_name= data['middle_name'], group= data['group'], tel= int(data['tel']), tel_parents= data['tel_parents'], email= data['email'], website= data['website'], adress= data['adress'], city= data['city'], state= data['state'])
put_in_db.save()
# print data['first_name'], data['last_name'], data['middle_name'], int(data['group']), int(data['tel']), int(data['tel_parents']), data['email'], data['website'], data['adress'], data['city'], data['state']
#Вывод результата, для наглядности
print Student.objects.all()



Отредактировано (Янв. 5, 2012 17:13:46)

Офлайн

#7 Янв. 6, 2012 16:55:07

Infernion
От:
Зарегистрирован: 2011-12-29
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Предотвращение повторной записи данных в БД.

Что бы не плодить тем.
У меня PostgreSQL, мне нужно что бы таблицы с XML при парсинге, автоматически создавались. Мне не известно за ведомо сколько полей и столбцов будет. Можно ли такое сделать в релиационных ДБ, или надо прибегать к документо-ориентированным?



Офлайн

#8 Янв. 9, 2012 07:31:45

Sergei
От:
Зарегистрирован: 2011-10-04
Сообщения: 29
Репутация: +  4  -
Профиль   Отправить e-mail  

Предотвращение повторной записи данных в БД.

Infernion
Что бы не плодить тем.
У меня PostgreSQL, мне нужно что бы таблицы с XML при парсинге, автоматически создавались. Мне не известно за ведомо сколько полей и столбцов будет. Можно ли такое сделать в релиационных ДБ,
Обычно это делают через EAV-концепт (http://en.wikipedia.org/wiki/Entity%E2%80%93attribute%E2%80%93value_model).
Например, есть приложение django-eav: http://mvpdev.github.com/django-eav/

Технически, можно и схему конечно менять, есть South http://south.aeracode.org/docs/ например,
но это не нужно в описанном случае.



Офлайн

  • Начало
  • » Django
  • » Предотвращение повторной записи данных в БД.[RSS Feed]

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version