Форум сайта python.su
Имеется парсер который берет инфу из 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)
Офлайн
Что никто не подскажет? Нужно то все го сделать проверку если там подобное или нет. Когда пишу:
if last_name == Student.objects.all():
continue
Отредактировано (Янв. 5, 2012 13:51:04)
Офлайн
Student это самонаписанный класс модели? Не знаю как реализован метод save у вас и в каком типе переменных хранится список студентов в классе Sudent.
Раз вы записываете в базу, то не легче ли при записи в базу проверять есть ли там данная запись студента, если есть то пропускать.
Есть множество, по сравнению с словарем он содержит только уникальные значения, мб в эту сторону копать. Кароче больше информации от вас нужно, я по крайней мере не могу сходу так сказать (предугадать) что у вас там, мб другие кто то смогут помочь больше
Офлайн
Piton23Ну в принципе я так и делал.
Раз вы записываете в базу, то не легче ли при записи в базу проверять есть ли там данная запись студента, если есть то пропускать.
print Student.objects.all()
Отредактировано (Янв. 5, 2012 13:51:47)
Офлайн
https://docs.djangoproject.com/en/1.3/ref/models/querysets/
раздел про get_or_create прочтите.
Офлайн
SergeiСпасибо, почитал документацию, понял как происходит выбор команд INSERT и UPDATE.
https://docs.djangoproject.com/en/1.3/r … querysets/
раздел про get_or_create прочтите.
#-*- 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)
Офлайн
Что бы не плодить тем.
У меня PostgreSQL, мне нужно что бы таблицы с XML при парсинге, автоматически создавались. Мне не известно за ведомо сколько полей и столбцов будет. Можно ли такое сделать в релиационных ДБ, или надо прибегать к документо-ориентированным?
Офлайн
InfernionОбычно это делают через EAV-концепт (http://en.wikipedia.org/wiki/Entity%E2%80%93attribute%E2%80%93value_model).
Что бы не плодить тем.
У меня PostgreSQL, мне нужно что бы таблицы с XML при парсинге, автоматически создавались. Мне не известно за ведомо сколько полей и столбцов будет. Можно ли такое сделать в релиационных ДБ,
Офлайн