Monday, 15 August 2011

python - How can insert a new object in one table after updating another table in flask-sqlalchemy -



python - How can insert a new object in one table after updating another table in flask-sqlalchemy -

i using flask-sqlalchemy orm in project.

i have insert new object in 1 table, whenever there update on table.so, chose models_committed signal.but, object not inserted.

@models_committed.connect_via(app) def on_models_committed(sender, changes): print "signal",changes obj, alter in changes: if obj.__table__.strip() == 'task': print "works" obj = taskhistory(task_id=target.id, task_status_id=target.task_status_id, reason=target.reason) print "history object",obj db.session.add(obj) db.session.commit()

traceback:

short version:

**sqlalchemy.exc.invalidrequesterror invalidrequesterror: session in 'committed' state; no farther sql can emitted within transaction.**

long version:

traceback (most recent phone call last): file "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1836, in __call__ homecoming self.wsgi_app(environ, start_response) file "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1820, in wsgi_app response = self.make_response(self.handle_exception(e)) file "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1403, in handle_exception reraise(exc_type, exc_value, tb) file "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1817, in wsgi_app response = self.full_dispatch_request() file "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1477, in full_dispatch_request rv = self.handle_user_exception(e) file "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1381, in handle_user_exception reraise(exc_type, exc_value, tb) file "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1475, in full_dispatch_request rv = self.dispatch_request() file "/usr/local/lib/python2.7/dist-packages/flask_debugtoolbar/__init__.py", line 125, in dispatch_request homecoming view_func(**req.view_args) file "/usr/lib/python2.7/cprofile.py", line 149, in runcall homecoming func(*args, **kw) file "/usr/local/lib/python2.7/dist-packages/flask_superadmin/base.py", line 37, in inner homecoming f(self, *args, **kwargs) file "/usr/local/lib/python2.7/dist-packages/flask_superadmin/base.py", line 37, in inner homecoming f(self, *args, **kwargs) file "/usr/local/lib/python2.7/dist-packages/flask_superadmin/base.py", line 37, in inner homecoming f(self, *args, **kwargs) file "/usr/local/lib/python2.7/dist-packages/flask_superadmin/base.py", line 37, in inner homecoming f(self, *args, **kwargs) file "/usr/local/lib/python2.7/dist-packages/flask_superadmin/model/base.py", line 345, in edit pk=self.get_pk(instance), instance=instance) file "/usr/local/lib/python2.7/dist-packages/flask_superadmin/base.py", line 169, in render homecoming render_template(template, **kwargs) file "/usr/local/lib/python2.7/dist-packages/flask/templating.py", line 128, in render_template context, ctx.app) file "/usr/local/lib/python2.7/dist-packages/flask/templating.py", line 110, in _render rv = template.render(context) file "/usr/share/pyshared/jinja2/environment.py", line 969, in render homecoming self.environment.handle_exception(exc_info, true) file "/usr/share/pyshared/jinja2/environment.py", line 742, in handle_exception reraise(exc_type, exc_value, tb) file "/usr/local/lib/python2.7/dist-packages/flask_superadmin/templates/admin/model/edit.html", line 3, in top-level template code {% set name = admin_view.get_display_name() %} file "/usr/local/lib/python2.7/dist-packages/flask_superadmin/templates/admin/layout.html", line 21, in top-level template code {% block page_body %} file "/usr/local/lib/python2.7/dist-packages/flask_superadmin/templates/admin/layout.html", line 70, in block "page_body" {% block body %}{% endblock %} file "/usr/local/lib/python2.7/dist-packages/flask_superadmin/templates/admin/model/edit.html", line 26, in block "body" {{ lib.render_form(form, extra(), admin_view.can_edit, admin_view.can_delete) }} file "/usr/local/lib/python2.7/dist-packages/flask_superadmin/templates/admin/_macros.html", line 192, in template {{ render_formfield(form) }} file "/usr/local/lib/python2.7/dist-packages/flask_superadmin/templates/admin/_macros.html", line 180, in template {{ render_ff(form._fields[field_name]) }} file "/usr/local/lib/python2.7/dist-packages/flask_superadmin/templates/admin/_macros.html", line 142, in template {{ ff(class=class) }} file "/usr/local/lib/python2.7/dist-packages/wtforms/fields/core.py", line 139, in __call__ homecoming self.widget(self, **kwargs) file "/usr/local/lib/python2.7/dist-packages/flask_superadmin/form.py", line 96, in __call__ homecoming super(chosenselectwidget, self).__call__(field, **kwargs) file "/usr/local/lib/python2.7/dist-packages/wtforms/widgets/core.py", line 243, in __call__ val, label, selected in field.iter_choices(): file "/usr/local/lib/python2.7/dist-packages/wtforms/ext/sqlalchemy/fields.py", line 108, in iter_choices pk, obj in self._get_object_list(): file "/usr/local/lib/python2.7/dist-packages/wtforms/ext/sqlalchemy/fields.py", line 101, in _get_object_list self._object_list = list((text_type(get_pk(obj)), obj) obj in query) file "/usr/local/lib/python2.7/dist-packages/sqlalchemy/orm/query.py", line 2404, in __iter__ homecoming self._execute_and_instances(context) file "/usr/local/lib/python2.7/dist-packages/sqlalchemy/orm/query.py", line 2417, in _execute_and_instances close_with_result=true) file "/usr/local/lib/python2.7/dist-packages/sqlalchemy/orm/query.py", line 2408, in _connection_from_session **kw) file "/usr/local/lib/python2.7/dist-packages/sqlalchemy/orm/session.py", line 843, in connection close_with_result=close_with_result) file "/usr/local/lib/python2.7/dist-packages/sqlalchemy/orm/session.py", line 847, in _connection_for_bind homecoming self.transaction._connection_for_bind(engine) file "/usr/local/lib/python2.7/dist-packages/sqlalchemy/orm/session.py", line 298, in _connection_for_bind self._assert_active() file "/usr/local/lib/python2.7/dist-packages/sqlalchemy/orm/session.py", line 192, in _assert_active "this session in 'committed' state; no farther " invalidrequesterror: session in 'committed' state; no farther sql can emitted within transaction.

could assist me on solving issue?

tools using: python 2.7, flask, sqlalchemy

@models_committed.connect_via(app) def on_models_committed(sender, changes): db_name = app.config["db_name"] db_user = app.config["db_user"] db_pwd = app.config["db_pwd"] conn = psycopg2.connect("dbname='%s' user='%s' host='localhost' password='%s'" %(db_name, db_user, db_pwd)) query = "insert task_history(task_id, task_status_id, updated_on, updated_by, reason)" +\ "values (%s, %s, '%s', %s, '%s')" cur = conn.cursor() obj, alter in changes: if str(obj.__table__).strip() == 'task': cur.execute(query % (obj.id, obj.task_status_id, "now()", 2, "thats it")) conn.commit()

my solution(i have answered question):

created seperate connection using psycopg2 inserted new object

python flask flask-sqlalchemy

No comments:

Post a Comment