Cleaning metadata

19 views
Skip to first unread message

Javier Collado Jiménez

unread,
Mar 25, 2020, 6:27:20 AM3/25/20
to sqlalchemy
Hello,
I'm having a problem trying to cleanup sqlalchemy objects. My application has a thread which handles DB connections. In some cases the thread dies and I want to do a cleanup so, next time the thread is started it would be able to reconnect again.
The steps I tried are:
            self.metadata.clear()
            self.engine.dispose()
            self.session.close()
            self.conn.close()
But when I start a new thread, errors like this appear:
sqlalchemy.exc.ArgumentError: Column object 'column' already assigned to Table 'table'

Simon King

unread,
Mar 25, 2020, 6:55:13 AM3/25/20
to sqlal...@googlegroups.com
It's difficult to answer this question without knowing how your code
is structured. Are you reflecting your tables from the database, or
have you defined them statically?

What is the full stack trace when you get those errors?

Simon
> --
> 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 sqlalchemy+...@googlegroups.com.
> To view this discussion on the web visit https://groups.google.com/d/msgid/sqlalchemy/74117457-9968-4aa2-afa3-8ccb91e86937%40googlegroups.com.

Mike Bayer

unread,
Mar 25, 2020, 8:30:47 AM3/25/20
to noreply-spamdigest via sqlalchemy
you should not be calling metadata.clear() and it looks like you are doing something where you are building Table objects on the fly, re-using the same Column objects a second time, leading to the error you are seeing.  There should be a single MetaData object that is not part of an object, e.g. it's a global variable in your program (e.g. not "self.metadata").

Similarly for the engine, there should not be a "self.engine", there should be a single Engine object that is also a global variable in your program.  It is also threadsafe and can be shared among multiple threads.

Javier Collado Jiménez

unread,
Mar 26, 2020, 3:25:06 AM3/26/20
to sqlalchemy
Thank you Mike!
I'm going to try this different approach.
To unsubscribe from this group and stop receiving emails from it, send an email to sqlal...@googlegroups.com.
Reply all
Reply to author
Forward
0 new messages