Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 11, 2009 13:51:14

hildi
От:
Зарегистрирован: 2008-10-07
Сообщения: 66
Репутация: +  0  -
Профиль   Отправить e-mail  

TG+SA: Identity Management --> IntegrityError

Заранее прошу прощения за формулировку вопроса (точнее, за практическое ее отсутствие), я просто сама ни фига не понимаю, как обычно.

Ситуация следующая: есть некоторый условно стабильно работающий продукт (Postgres+TG+SA), где речь идет в основном о расчете и показе разных статистик на основе содержимого базы. К проекту былo добавленo identity (просто взят пример из identity_tutorial практически без изменений), после чего при запросе практически всех веб-страниц начал вываливаться:

IntegrityError: (IntegrityError) null value in column “blabla” violates not-null constraint.
'INSERT INTO ta_port_cpop (blabla) VALUES (%(blabla)s)'%{'blabla': None}
На самом деле, полей там мильен, и во все пытается записаться пустое значение. На сервере лежит билд без identity, там все работает нормально и никаких тебе пустых значений в нот-нулль констрейнтах, так что с базой все в порядке по идее.

Само identity работает нормально (вроде бы). Юзеры добавляются, права им приписываются, ими можно залогиниться и посмотреть первую страницу, на которую редиректится после логина. А все последующие уже нельзя - независимо от юзера и прописанных прав просмотра, т. е., даже если ограничения просмотра отключить, то все равно выдает ошибку.

Модули с identity с собсно продуктом вообще никак не пересекаются - кроме как в контроллере, где указывается, какая группа какие страницы может смотреть.

Первая непонятка в том, что при заходе на страницу в базу вообще ничего писаться не должно, база только опрашивается на предмет разных статистик.

Вторая непонятка в том, что я не могу понять, где оно обваливается (см. код из контроллера ниже).

Any ideas?

Еще раз мильен пардонов за много бестолковых букв и огромное спасибо заранее.



Вот код страницы из контроллера:

    @expose()
#@expose(template="cmts.templates.cmtslist")
#@identity.require(identity.not_anonymous())
def cmtslist(self, *args, **kw):
cmts = CMTS()
cmts_list, cmts_list_sorted = cmts.getCMTS(kw['id_cpop'])[0], cmts.getCMTS(kw['id_cpop'])[1]# <----- тут все работает
print cmts_list, cmts_list_sorted, "\n@ cmtslist in controllers.py ---> got list" #<---- и тут еще все работает

return str(cmts_list)# <---- а вот тут уже нет, в броузер вываливается IntegrityError
#return dict(cmts_list = cmts_list, cmts_list_sorted = cmts_list_sorted)
Собсно, лог ошибки:

Page handler: <bound method Root.cmtslist of <cmts.controllers.Root object at 0x021ADB70>>
Traceback (most recent call last):
File "c:\Python25\lib\site-packages\cherrypy-2.3.0-py2.5.egg\cherrypy\_cphttptools.py", line 121, in _run
self.main()
File "c:\Python25\lib\site-packages\cherrypy-2.3.0-py2.5.egg\cherrypy\_cphttptools.py", line 264, in main
body = page_handler(*virtual_path, **self.params)
File "<string>", line 3, in cmtslist
File "c:\Python25\lib\site-packages\turbogears-1.0.7-py2.5.egg\turbogears\controllers.py", line 360, in expose
*args, **kw)
File "<string>", line 5, in run_with_transaction
File "c:\Python25\lib\site-packages\turbogears-1.0.7-py2.5.egg\turbogears\database.py", line 434, in sa_rwt
session.commit()
File "c:\Python25\lib\site-packages\sqlalchemy-0.5.0rc1-py2.5.egg\sqlalchemy\orm\scoping.py", line 106, in do
return getattr(self.registry(), name)(*args, **kwargs)
File "c:\Python25\lib\site-packages\sqlalchemy-0.5.0rc1-py2.5.egg\sqlalchemy\orm\session.py", line 669, in commit
self.transaction.commit()
File "c:\Python25\lib\site-packages\sqlalchemy-0.5.0rc1-py2.5.egg\sqlalchemy\orm\session.py", line 375, in commit
self._prepare_impl()
File "c:\Python25\lib\site-packages\sqlalchemy-0.5.0rc1-py2.5.egg\sqlalchemy\orm\session.py", line 359, in _prepare_impl
self.session.flush()
File "c:\Python25\lib\site-packages\sqlalchemy-0.5.0rc1-py2.5.egg\sqlalchemy\orm\session.py", line 1367, in flush
self._flush(objects)
File "c:\Python25\lib\site-packages\sqlalchemy-0.5.0rc1-py2.5.egg\sqlalchemy\orm\session.py", line 1437, in _flush
flush_context.execute()
File "c:\Python25\lib\site-packages\sqlalchemy-0.5.0rc1-py2.5.egg\sqlalchemy\orm\unitofwork.py", line 263, in execute
UOWExecutor().execute(self, tasks)
File "c:\Python25\lib\site-packages\sqlalchemy-0.5.0rc1-py2.5.egg\sqlalchemy\orm\unitofwork.py", line 757, in execute
self.execute_save_steps(trans, task)
File "c:\Python25\lib\site-packages\sqlalchemy-0.5.0rc1-py2.5.egg\sqlalchemy\orm\unitofwork.py", line 772, in execute_save_steps
self.save_objects(trans, task)
File "c:\Python25\lib\site-packages\sqlalchemy-0.5.0rc1-py2.5.egg\sqlalchemy\orm\unitofwork.py", line 763, in save_objects
task.mapper._save_obj(task.polymorphic_tosave_objects, trans)
File "c:\Python25\lib\site-packages\sqlalchemy-0.5.0rc1-py2.5.egg\sqlalchemy\orm\mapper.py", line 1215, in _save_obj
c = connection.execute(statement.values(value_params), params)
File "c:\Python25\lib\site-packages\sqlalchemy-0.5.0rc1-py2.5.egg\sqlalchemy\engine\base.py", line 848, in execute
return Connection.executors[c](self, object, multiparams, params)
File "c:\Python25\lib\site-packages\sqlalchemy-0.5.0rc1-py2.5.egg\sqlalchemy\engine\base.py", line 899, in execute_clauseelement
return self._execute_compiled(elem.compile(dialect=self.dialect, column_keys=keys, inline=len(params) > 1), distilled_params=params)
File "c:\Python25\lib\site-packages\sqlalchemy-0.5.0rc1-py2.5.egg\sqlalchemy\engine\base.py", line 911, in _execute_compiled
self.__execute_raw(context)
File "c:\Python25\lib\site-packages\sqlalchemy-0.5.0rc1-py2.5.egg\sqlalchemy\engine\base.py", line 920, in __execute_raw
self._cursor_execute(context.cursor, context.statement, context.parameters[0], context=context)
File "c:\Python25\lib\site-packages\sqlalchemy-0.5.0rc1-py2.5.egg\sqlalchemy\engine\base.py", line 964, in _cursor_execute
self._handle_dbapi_exception(e, statement, parameters, cursor)
File "c:\Python25\lib\site-packages\sqlalchemy-0.5.0rc1-py2.5.egg\sqlalchemy\engine\base.py", line 946, in _handle_dbapi_exception
raise exc.DBAPIError.instance(statement, parameters, e, connection_invalidated=is_disconnect)
IntegrityError: (IntegrityError) null value in column "id_port" violates not-null constraint
'INSERT INTO ta_port_cpop (region, id_cpop, id_cmts, id_port, cpop_name, cmts_name, cmts_ip, cmts_type, max_linecards, linecard, port_name, port_type, dpk, uss, cpop_isonline, cpop_first_seen, cpop_last_seen, cpop_cw_first_seen, cpop_cw_last_seen, cmts_isonline, cmts_first_seen, cmts_last_seen, cmts_cw_first_seen, cmts_cw_last_seen, port_isonline, port_first_seen, port_last_seen, port_cw_first_seen, port_cw_last_seen) VALUES (%(region)s, %(id_cpop)s, %(id_cmts)s, %(id_port)s, %(cpop_name)s, %(cmts_name)s, %(cmts_ip)s, %(cmts_type)s, %(max_linecards)s, %(linecard)s, %(port_name)s, %(port_type)s, %(dpk)s, %(uss)s, %(cpop_isonline)s, %(cpop_first_seen)s, %(cpop_last_seen)s, %(cpop_cw_first_seen)s, %(cpop_cw_last_seen)s, %(cmts_isonline)s, %(cmts_first_seen)s, %(cmts_last_seen)s, %(cmts_cw_first_seen)s, %(cmts_cw_last_seen)s, %(port_isonline)s, %(port_first_seen)s, %(port_last_seen)s, %(port_cw_first_seen)s, %(port_cw_last_seen)s)' {'cmts_first_seen': None, 'cmts_last_seen': None, 'cpop_first_seen': None, 'port_name': None, 'port_type': None, 'port_isonline': None, 'cmts_type': None, 'port_cw_last_seen': None, 'uss': None, 'cpop_name': None, 'cpop_cw_first_seen': None, 'cpop_cw_last_seen': None, 'id_port': None, 'cmts_name': None, 'cmts_cw_last_seen': None, 'cpop_isonline': None, 'cpop_last_seen': None, 'id_cpop': None, 'id_cmts': None, 'max_linecards': None, 'linecard': None, 'cmts_isonline': None, 'port_first_seen': None, 'port_last_seen': None, 'cmts_ip': None, 'port_cw_first_seen': None, 'dpk': None, 'region': None, 'cmts_cw_first_seen': None}

Powered by CherryPy 2.3.0



Офлайн

#2 Сен. 12, 2009 06:15:53

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

TG+SA: Identity Management --> IntegrityError

По приведенному куску могу только предположить направление куда рыть. Identity пишет в базу время последнего визита и делает flush для сессии. У вас где-то в рамках сессии создается пустой объект, что пишется в таблицу ta_port_cpop(вам лучше знать что это такое ;)). Пока в методе не было flush - все было в порядке - пустой объект тихо умирал, а сейчас его пытаются записать в базу. Просмотрите методы __init__ и getCMTS у CMTS - возможно там.

ЗЫ: вот здесь может хорошо может помочь отладчик - импортируйте pdb и оттрассируйте метод - где-то этот объект у вас таки создается.



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Офлайн

#3 Сен. 12, 2009 08:54:56

hildi
От:
Зарегистрирован: 2008-10-07
Сообщения: 66
Репутация: +  0  -
Профиль   Отправить e-mail  

TG+SA: Identity Management --> IntegrityError

Спасибо большое! Мне вот именно направление, куда рыть!

Вообще-то, у меня в ta_port_cpop ничего не пишется, только читается оттуда.
Может быть, проблема в неудачной формулировке? В методах CMTS часто встречается примерно такое (по памяти, а то код на работе):

Class Port: pass #где-то в модели таблица ta_port_cpop маппится в класс Port
mapper(Port, port)

def blaCMTS():
Session = sessionmaker()
session = Session()
q = session.query(Port).filter(blabla).all()
session.close() #может, сессию как-то по-другому лучше закрывать?
return q
Ну и все, никаких писаний в базу.
Метод __init__ я тоже специально не формулировала. CMTS - это, по сути, просто набор отдельных скриптов, объединенных для удобства в один класс.



Офлайн

#4 Сен. 14, 2009 11:29:36

hildi
От:
Зарегистрирован: 2008-10-07
Сообщения: 66
Репутация: +  0  -
Профиль   Отправить e-mail  

TG+SA: Identity Management --> IntegrityError

Заменила во всех функциях как на примере выше session.close() на session.close_all(), все заработало.

Огромное спасибо!



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version