can you please just post a simple failing test? there's nothing unusual about any of these stack traces. I don't know what you're trying to do.
On Mon, May 7, 2018 at 10:52 PM, Colton Allen <[email protected]> wrote: > Sorry to spam you. The logs didn't paste in full. > > > api_1 | Traceback (most recent call last): > api_1 | File > "/usr/local/lib/python3.5/site-packages/werkzeug/wsgi.py", line 660, in > __call__ > api_1 | return app(environ, start_response) > api_1 | File "/usr/local/lib/python3.5/site-packages/flask/app.py", > line 2000, in __call__ > api_1 | return self.wsgi_app(environ, start_response) > api_1 | File "/usr/local/lib/python3.5/site-packages/flask/app.py", > line 1988, in wsgi_app > api_1 | response = self.full_dispatch_request() > api_1 | File > "/usr/local/lib/python3.5/site-packages/flask_cors/extension.py", line 161, > in wrapped_function > api_1 | return cors_after_request(app.make_response(f(*args, > **kwargs))) > api_1 | File "/usr/local/lib/python3.5/site-packages/flask/app.py", > line 1567, in handle_exception > api_1 | reraise(exc_type, exc_value, tb) > api_1 | File > "/usr/local/lib/python3.5/site-packages/flask/_compat.py", line 33, in > reraise > api_1 | raise value > api_1 | File "/usr/local/lib/python3.5/site-packages/flask/app.py", > line 1988, in wsgi_app > api_1 | response = self.full_dispatch_request() > api_1 | File "/usr/local/lib/python3.5/site-packages/flask/app.py", > line 1639, in full_dispatch_request > api_1 | rv = self.dispatch_request() > api_1 | File > "/usr/local/lib/python3.5/site-packages/flask_cors/extension.py", line 161, > in wrapped_function > api_1 | return cors_after_request(app.make_response(f(*args, > **kwargs))) > api_1 | File "/usr/local/lib/python3.5/site-packages/flask/app.py", > line 1544, in handle_user_exception > api_1 | reraise(exc_type, exc_value, tb) > api_1 | File > "/usr/local/lib/python3.5/site-packages/flask/_compat.py", line 33, in > reraise > api_1 | raise value > api_1 | File "/usr/local/lib/python3.5/site-packages/flask/app.py", > line 1639, in full_dispatch_request > api_1 | rv = self.dispatch_request() > api_1 | File "/usr/local/lib/python3.5/site-packages/flask/app.py", > line 1625, in dispatch_request > api_1 | return self.view_functions[rule.endpoint](**req.view_args) > api_1 | File "/app/common/errors.py", line 67, in decorator > api_1 | return fn(*args, **kwargs) > api_1 | File "/app/common/auth.py", line 295, in decorator > api_1 | return fn(*args, **kwargs) > api_1 | File "/app/common/auth.py", line 303, in decorator > api_1 | return fn(*args, **kwargs) > api_1 | File > "/usr/local/lib/python3.5/site-packages/flask_principal.py", line 199, in > _decorated > api_1 | rv = f(*args, **kw) > api_1 | File "/usr/local/lib/python3.5/site-packages/flask/views.py", > line 84, in view > api_1 | return self.dispatch_request(*args, **kwargs) > api_1 | File "/app/common/resource.py", line 104, in dispatch_request > api_1 | return action(*args, **kwargs) > api_1 | File "/app/api/account/resources/pages/__init__.py", line 66, > in patch > api_1 | model = self.save(model) > api_1 | File "/app/api/account/resources/pages/__init__.py", line 84, > in save > api_1 | model.revise() > api_1 | File "/app/common/revision.py", line 77, in revise > api_1 | execute_preprocessors(self) > api_1 | File "/app/common/revision.py", line 84, in > execute_preprocessors > api_1 | processor(target) > api_1 | File "/app/models/post/__init__.py", line 160, in > manage_review_status > api_1 | if not target.account.settings.compliance_enable_post: > api_1 | File > "/usr/local/lib/python3.5/site-packages/sqlalchemy/orm/attributes.py", line > 237, in __get__ > api_1 | return self.impl.get(instance_state(instance), dict_) > api_1 | File > "/usr/local/lib/python3.5/site-packages/sqlalchemy/orm/attributes.py", line > 584, in get > api_1 | value = self.callable_(state, passive) > api_1 | File > "/usr/local/lib/python3.5/site-packages/sqlalchemy/orm/strategies.py", line > 557, in _load_for_state > api_1 | return self._emit_lazyload(session, state, ident_key, > passive) > api_1 | File "<string>", line 1, in <lambda> > api_1 | > api_1 | File > "/usr/local/lib/python3.5/site-packages/sqlalchemy/orm/strategies.py", line > 635, in _emit_lazyload > api_1 | result = q.all() > api_1 | File > "/usr/local/lib/python3.5/site-packages/sqlalchemy/orm/query.py", line 2703, > in all > api_1 | return list(self) > api_1 | File > "/usr/local/lib/python3.5/site-packages/sqlalchemy/orm/query.py", line 2854, > in __iter__ > api_1 | self.session._autoflush() > api_1 | File > "/usr/local/lib/python3.5/site-packages/sqlalchemy/orm/session.py", line > 1365, in _autoflush > api_1 | self.flush() > api_1 | File > "/usr/local/lib/python3.5/site-packages/sqlalchemy/orm/session.py", line > 2139, in flush > api_1 | self._flush(objects) > api_1 | File "/app/common/sqlalchemy.py", line 17, in _flush > api_1 | super()._flush(objects) > api_1 | File "/app/common/sqlalchemy.py", line 17, in _flush > api_1 | super()._flush(objects) > api_1 | File "/usr/local/lib/python3.5/bdb.py", line 48, in > trace_dispatch > api_1 | return self.dispatch_line(frame) > api_1 | File "/usr/local/lib/python3.5/bdb.py", line 67, in > dispatch_line > api_1 | if self.quitting: raise BdbQuit > api_1 | bdb.BdbQuit > > On Monday, May 7, 2018 at 7:27:03 PM UTC-7, Mike Bayer wrote: >> >> can you perhaps place a "pdb.set_trace()" inside of session._flush()? >> using the debugger you can see the source of every flush() call. >> Generally, it occurs each time a query is about to emit SQL. >> >> On Mon, May 7, 2018 at 9:37 PM, Colton Allen <[email protected]> wrote: >> > What exactly causes the session to flush? I'm trying to track down a >> > nasty >> > bug in my versioning system. >> > >> > Sorry for the long code dump. I retooled >> > examples/versioned_history/history_meta.py so it should look familiar. >> > The >> > function that's breaking is "column_has_changed". I've added some logs >> > as >> > well. >> > >> > # WHEN IT WORKS! >> > >> > CRITICAL:root:BEFORE MAPPING NEW VALUES >> > CRITICAL:root:BEFORE SAVE >> > CRITICAL:root:BEFORE REVISE >> > CRITICAL:root:CHECK COLUMN CHANGES >> > CRITICAL:root:AFTER REVISE >> > CRITICAL:root:flush! >> > CRITICAL:root:AFTER SAVE >> > CRITICAL:root:flush! >> > >> > # WHEN IT DOESN'T WORK! >> > >> > CRITICAL:root:BEFORE MAPPING NEW VALUES >> > CRITICAL:root:BEFORE SAVE >> > CRITICAL:root:BEFORE REVISE >> > CRITICAL:root:flush! >> > CRITICAL:root:CHECK COLUMN CHANGES >> > CRITICAL:root:AFTER REVISE >> > CRITICAL:root:AFTER SAVE >> > CRITICAL:root:flush! >> > >> > controller.py >> > >> > for k, v in dict.items(): >> > setattr(model, k, v) >> > model.revise() >> > db.session.add(model) >> > db.session.commit() >> > >> > model.py >> > >> > class RevisionMixin: >> > """Version control manager.""" >> > >> > def revise(self): >> > db.session.add(self) >> > write_revision(self) >> > >> > version.py >> > >> > def write_revision(target): >> > target_mapper = orm.object_mapper(target) >> > revision_class = target.__versioned__['model'] >> > revision_mapper = revision_class.__mapper__ >> > >> > object_changed = False >> > state = {} >> > >> > for column in iter_mapper_columns(target_mapper, revision_mapper): >> > state[column.key] = getattr(target, column.key) >> > column_changed = column_has_changed(target, column.key) >> > object_changed = object_changed or column_changed >> > >> > for relationship, changed in iter_relationships(target, >> > target_mapper): >> > if hasattr(revision_class, relationship.key): >> > state[relationship.key] = getattr(target, relationship.key) >> > object_changed = object_changed or changed >> > >> > if not isinstance(target.id, str) or object_changed: >> > _write_revision(target, state) >> > >> > >> > def _write_revision(target, state): >> > version = target.version or 0 >> > version = version + 1 >> > state['version'] = version >> > state['updated_at'] = db.now() >> > state['primary'] = target >> > >> > revision = target.__versioned__['model'](**state) >> > db.session.add(revision) >> > >> > target.version = version >> > target.updated_at = state['updated_at'] >> > >> > >> > def iter_mapper_columns(primary, revision): >> > mappers = zip(primary.iterate_to_root(), revision.iterate_to_root()) >> > for om, hm in mappers: >> > if hm.single: >> > continue >> > for column in iter_shared_columns(om, hm): >> > yield column >> > >> > >> > def iter_shared_columns(mapper, comparison_mapper): >> > for comparison_mapper_column in comparison_mapper.local_table.c: >> > if 'version_meta' in comparison_mapper_column.info: >> > continue >> > >> > try: >> > mapper_column = >> > mapper.local_table.c[comparison_mapper_column.key] >> > yield mapper.get_property_by_column(mapper_column) >> > except UnmappedColumnError: >> > continue >> > >> > >> > def iter_relationships(target, mapper): >> > for prop in mapper.iterate_properties: >> > if isinstance(prop, RelationshipProperty): >> > passive = attributes.PASSIVE_NO_INITIALIZE >> > changed = attributes.get_history( >> > target, prop.key, passive=passive).has_changes() >> > yield prop, changed >> > >> > >> > def column_has_changed(target, column_name): >> > # Sometimes the instance state history can't be properly >> > # calculated? No flushing during versioning. Unsure why its not >> > # working. >> > added, _, deleted = attributes.get_history(target, column_name) >> > return bool(added or deleted) >> > >> > >> > def relationship_has_changed(prop): >> > for p in prop.local_columns: >> > if p.foreign_keys: >> > return True >> > return False >> > >> > >> > -- >> > SQLAlchemy - >> > The Python SQL Toolkit and Object Relational Mapper >> > >> > http://www.sqlalchemy.org/ >> > >> > To post example code, please provide an MCVE: Minimal, Complete, and >> > Verifiable Example. See http://stackoverflow.com/help/mcve for a full >> > description. >> > --- >> > You received this message because you are subscribed to the Google >> > Groups >> > "sqlalchemy" group. >> > To unsubscribe from this group and stop receiving emails from it, send >> > an >> > email to [email protected]. >> > To post to this group, send email to [email protected]. >> > Visit this group at https://groups.google.com/group/sqlalchemy. >> > For more options, visit https://groups.google.com/d/optout. > > -- > SQLAlchemy - > The Python SQL Toolkit and Object Relational Mapper > > http://www.sqlalchemy.org/ > > To post example code, please provide an MCVE: Minimal, Complete, and > Verifiable Example. See http://stackoverflow.com/help/mcve for a full > description. > --- > You received this message because you are subscribed to the Google Groups > "sqlalchemy" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to [email protected]. > To post to this group, send email to [email protected]. > Visit this group at https://groups.google.com/group/sqlalchemy. > For more options, visit https://groups.google.com/d/optout. -- SQLAlchemy - The Python SQL Toolkit and Object Relational Mapper http://www.sqlalchemy.org/ To post example code, please provide an MCVE: Minimal, Complete, and Verifiable Example. See http://stackoverflow.com/help/mcve for a full description. --- You received this message because you are subscribed to the Google Groups "sqlalchemy" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To post to this group, send email to [email protected]. Visit this group at https://groups.google.com/group/sqlalchemy. For more options, visit https://groups.google.com/d/optout.
