Портал Python-программистов

Форумы сайта python.su

Вы не зашли.

Объявление

Официальная wiki коммунити: wiki.python.su обсуждение

Официальная джаббер конференция коммунити: pythonua@conference.jabber.ru (всегда 20-35 онлайн участников). Настройки

КОД ОБОРАЧИВАТЬ В ТЕГИ [code][/code]
  • > TurboGears
  • > TG+SA: Identity Management --> IntegrityError [RSS Feed]

#1 2009-09-11 14:51:14

hildi
Питонер
Зарегистрирован: 2008-10-07
Сообщений: 64
Профиль

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 2009-09-12 07:15:53

PooH
Питонер
Откуда: Барнаул
Зарегистрирован: 2006-12-05
Сообщений: 804
Профиль

Re: TG+SA: Identity Management --> IntegrityError

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

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

Неактивен

 

#3 2009-09-12 09:54:56

hildi
Питонер
Зарегистрирован: 2008-10-07
Сообщений: 64
Профиль

Re: 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 2009-09-14 12:29:36

hildi
Питонер
Зарегистрирован: 2008-10-07
Сообщений: 64
Профиль

Re: TG+SA: Identity Management --> IntegrityError

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

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

Неактивен

 
  • > TurboGears
  • TG+SA: Identity Management --> IntegrityError [RSS Feed]

Board footer

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson

Board footer

Реклама: