You haven't explained in what way it's not working with your latest iteration.
The last code you posted only called session.close() if session.is_active was true. Are you sure you really are closing the session? Simon On Fri, Feb 16, 2018 at 10:02 AM, <eugene.de...@gmail.com> wrote: > This option does not suit me. > My app based on CherryPy 3.2.2. > I add more logging, and all session closing by > session.close() > in finally section. > I can't understand why this not work... > > четверг, 15 февраля 2018 г., 18:07:49 UTC+3 пользователь Антонио Антуан > написал: >> >> You need just that: >> from proj.core import Session >> >> @app.teardown_request >> def clear_session(): >> Session.remove() >> >> Session created with scoper_session, of course. We do not use >> flask-sqlalchemy package, just flask and separated sqlalchemy. >> >> >> чт, 15 февр. 2018 г., 16:28 Simon King <si...@simonking.org.uk>: >>> >>> When you say your first execute function doesn't work, what do you >>> mean? Do you get an error? Do the results not show up in the database? >>> >>> I don't think there's any need for session.begin() >>> >>> >>> http://docs.sqlalchemy.org/en/latest/orm/session_api.html#sqlalchemy.orm.session.Session.begin >>> >>> Simon >>> >>> On Thu, Feb 15, 2018 at 12:33 PM, <eugene...@gmail.com> wrote: >>> > Hello, Simon! >>> > Where did you read that I was using Flask? >>> > I just write about it like example few posts ago. >>> > Anyway. >>> > I try another variant without decorator - just execute function >>> > def execute(statement, **kwargs): >>> > session = SESSION() >>> > session.begin(subtransactions=True) >>> > kwargs['tries'] = kwargs.get('tries', 0) >>> > fetch = kwargs.get('fetch', 'all') >>> > try: >>> > result = session.execute(statement) >>> > if fetch == 'all': >>> > return result.fetchall() >>> > elif fetch is False: >>> > return True >>> > elif fetch == 'count': >>> > return result >>> > return result.fetchone() >>> > except ResourceClosedError: >>> > session.rollback() >>> > session.close() >>> > time.sleep(.1) >>> > print('try number {}'.format(kwargs['tries'])) >>> > if kwargs['tries'] < 100: >>> > kwargs['tries'] += 1 >>> > return execute(statement, **kwargs) >>> > return list() >>> > except Exception as e: >>> > session.rollback() >>> > session.close() >>> > print(e) >>> > print(statement) >>> > finally: >>> > if session.is_active: >>> > session.commit() >>> > session.close() >>> > but that not help too. Idk why that not work. >>> > >>> > I try another variant: >>> > >>> > def execute(statement, **kwargs): >>> > fetch = kwargs.get('fetch', 'all') >>> > with engine.connect() as session: >>> > result = session.execute(statement) >>> > if fetch == 'all': >>> > return result.fetchall() >>> > elif fetch is False: >>> > return list() >>> > elif fetch == 'count': >>> > return result >>> > return result.fetchone() >>> > >>> > But same error. That variant must always close connection after return, >>> > but >>> > problem in something another. >>> > >>> > >>> > >>> > четверг, 15 февраля 2018 г., 13:21:51 UTC+3 пользователь Simon King >>> > написал: >>> >> >>> >> Personally I wouldn't use decorators for this. I would make every >>> >> function that needs to interact with the database take an explicit >>> >> session parameter, and I would use the facilities of the web framework >>> >> to create the session at the beginning of the request and close it at >>> >> the end. I've never used Flask, but I see it has a "signals" mechanism >>> >> (http://flask.pocoo.org/docs/0.12/api/#signals) with request_started >>> >> and request_finished events. You could use the request_started signal >>> >> to create the session and attach it to the request object, and clean >>> >> it up in request_finished. >>> >> >>> >> Looking at the Flask docs, I think you could also write a simple >>> >> extension. They have a SQLite example at >>> >> http://flask.pocoo.org/docs/0.12/extensiondev/#the-extension-code, >>> >> which you ought to be able to adapt for SQLAlchemy. The app context is >>> >> per-request, so it should be safe >>> >> >>> >> (http://flask.pocoo.org/docs/0.12/appcontext/#locality-of-the-context). >>> >> >>> >> Hope that helps, >>> >> >>> >> Simon >>> >> >>> >> On Thu, Feb 15, 2018 at 9:52 AM, <eugene...@gmail.com> wrote: >>> >> > Hello, Simon! >>> >> > So what better way? >>> >> > Something like this? >>> >> > SESSION = sessionmaker(bind=engine, autocommit=True) >>> >> > >>> >> > >>> >> > >>> >> > @decorator_with_args >>> >> > def session_decorator(func, default=None): >>> >> > def wrapper(*a, **kw): >>> >> > session = SESSION() >>> >> > session.begin(subtransactions=True) >>> >> > if 'session' not in kw: >>> >> > kw['session'] = session >>> >> > try: >>> >> > return func(*a, **kw) >>> >> > except Exception as e: >>> >> > session.rollback() >>> >> > logging.error(e) >>> >> > return default >>> >> > finally: >>> >> > if session.is_active: >>> >> > session.commit() >>> >> > session.close() >>> >> > return wrapper >>> >> > >>> >> > I try create additional function >>> >> > >>> >> > @session_decorator() >>> >> > def execute(statement, **kwargs): >>> >> > session = kwargs['session'] >>> >> > fetch = kwargs.get('fetch', 'all') >>> >> > result = session.execute(statement) >>> >> > if fetch == 'all': >>> >> > return result.fetchall() >>> >> > elif fetch is False: >>> >> > return True >>> >> > elif fetch == 'count': >>> >> > return result >>> >> > return result.fetchone() >>> >> > >>> >> > and use it in all execute statements, but that not help. >>> >> > Still receive error >>> >> > This result object does not return rows. It has been closed >>> >> > automatically. >>> >> > But how it closed if that another session? >>> >> > Can you correct my code? >>> >> > >>> >> > >>> >> > >>> >> > >>> >> > среда, 14 февраля 2018 г., 17:45:59 UTC+3 пользователь Simon King >>> >> > написал: >>> >> >> >>> >> >> I think there are a couple of problems with this. >>> >> >> >>> >> >> 1. You are calling scoped_session and sessionmaker every time the >>> >> >> decorated function is called, which is unnecessary. sessionmaker >>> >> >> returns a factory function for creating sessions, so you typically >>> >> >> only have one sessionmaker() call in your application. You could >>> >> >> either make it a module-global, or do it during application >>> >> >> configuration. >>> >> >> >>> >> >> 2. You are never calling session.close(). This means that the >>> >> >> transaction started by a web request will stay open after the >>> >> >> request >>> >> >> ends. Since you are using scoped_session as well, the session is >>> >> >> maintained as a thread-local object, so when the thread handles >>> >> >> another web request, it will use the same session and the same >>> >> >> transaction. Your long-running transactions are probably the reason >>> >> >> why you are getting blocked requests. >>> >> >> >>> >> >> You might like to read >>> >> >> >>> >> >> >>> >> >> >>> >> >> http://docs.sqlalchemy.org/en/latest/orm/session_basics.html#session-frequently-asked-questions. >>> >> >> >>> >> >> I was going to say that you need to add a "finally" section to your >>> >> >> session_decorator that calls session.close(), but if you ever have >>> >> >> one >>> >> >> decorated function calling another decorated function, they are >>> >> >> going >>> >> >> to interfere with each other. If you are *absolutely certain* that >>> >> >> will never happen, adding the "finally" section will probably >>> >> >> improve >>> >> >> things, but I would recommend that you try to structure your app a >>> >> >> little differently, so that the session creation and teardown >>> >> >> happen >>> >> >> at the beginning and end of the web request. >>> >> >> >>> >> >> Hope that helps, >>> >> >> >>> >> >> Simon >>> >> >> >>> >> >> >>> >> >> On Wed, Feb 14, 2018 at 2:14 PM, <eugene...@gmail.com> wrote: >>> >> >> > Decorator like this >>> >> >> > >>> >> >> > engine = create_engine( >>> >> >> > >>> >> >> > >>> >> >> > >>> >> >> > >>> >> >> > 'mssql+pymssql://{LOGIN}:{PASSWORD}@{HOST}/{DATABASE}?charset={CHARSET}&timeout={TIMEOUT}'.format(**DATABASE), >>> >> >> > isolation_level='READ COMMITTED' >>> >> >> > ) >>> >> >> > >>> >> >> > >>> >> >> > def decorator_with_args(decorator_to_enhance): >>> >> >> > """ >>> >> >> > https://habrahabr.ru/post/141501/ >>> >> >> > """ >>> >> >> > def decorator_maker(*args, **kwargs): >>> >> >> > def decorator_wrapper(func): >>> >> >> > return decorator_to_enhance(func, *args, **kwargs) >>> >> >> > return decorator_wrapper >>> >> >> > return decorator_maker >>> >> >> > >>> >> >> > >>> >> >> > def scope_func(): >>> >> >> > return scoped_session(sessionmaker(bind=engine, >>> >> >> > autocommit=True))() >>> >> >> > >>> >> >> > >>> >> >> > @decorator_with_args >>> >> >> > def session_decorator(func, default=None, **kwargs): >>> >> >> > def wrapper(*a, **kw): >>> >> >> > session = scope_func() >>> >> >> > if 'session' not in kw: >>> >> >> > kw['session'] = session >>> >> >> > try: >>> >> >> > return func(*a, **kw) >>> >> >> > except Exception as e: >>> >> >> > session.rollback() >>> >> >> > >>> >> >> > print('#####FUNCTION NAME: {}'.format(func.__name__)) >>> >> >> > >>> >> >> > print(e) >>> >> >> > logging.error(e) >>> >> >> > return default >>> >> >> > return wrapper >>> >> >> > >>> >> >> > >>> >> >> > >>> >> >> > >>> >> >> > среда, 14 февраля 2018 г., 17:06:54 UTC+3 пользователь Simon King >>> >> >> > написал: >>> >> >> >> >>> >> >> >> The pattern you should be aiming for is one in which a fresh >>> >> >> >> transaction is started for every web request that touches the >>> >> >> >> database, and that the transaction is closed at the end of the >>> >> >> >> request. How are you ensuring that at the moment? >>> >> >> >> >>> >> >> >> Simon >>> >> >> >> >>> >> >> >> On Wed, Feb 14, 2018 at 12:51 PM, <eugene...@gmail.com> wrote: >>> >> >> >> > If I run tests where all functions run one-by-one - all tests >>> >> >> >> > passed. >>> >> >> >> > But when i run web app and functions can call almost in >>> >> >> >> > parallel >>> >> >> >> > then >>> >> >> >> > i >>> >> >> >> > have >>> >> >> >> > a problem, then there are problems - transactions can block >>> >> >> >> > each >>> >> >> >> > other. >>> >> >> >> > I tried to set the isolation level of SNAPSHOT and READ >>> >> >> >> > COMMITTED, >>> >> >> >> > but >>> >> >> >> > it >>> >> >> >> > did not help. >>> >> >> >> > >>> >> >> >> > среда, 14 февраля 2018 г., 14:58:37 UTC+3 пользователь >>> >> >> >> > eugene...@gmail.com >>> >> >> >> > написал: >>> >> >> >> >> >>> >> >> >> >> Hello, Mike! >>> >> >> >> >> In my web app i have many selects like >>> >> >> >> >> session.execute(select([table1]).where(condition)) >>> >> >> >> >> and not so much updates, inserts and deletes like >>> >> >> >> >> >>> >> >> >> >> session.execute(update(table1).where(condition).values(**values)) >>> >> >> >> >> session.execute(insert(table1).values(**values)) >>> >> >> >> >> session.execute(delete(table1).where(condition)) >>> >> >> >> >> >>> >> >> >> >> What better way to create session for web application? >>> >> >> >> >> Without additional components like flask-sqlalchemy. >>> >> >> >> >> >>> >> >> >> >> суббота, 27 января 2018 г., 20:23:05 UTC+3 пользователь Mike >>> >> >> >> >> Bayer >>> >> >> >> >> написал: >>> >> >> >> >>> >>> >> >> >> >>> On Sat, Jan 27, 2018 at 5:49 AM, Евгений Рымарев >>> >> >> >> >>> <rymarev...@gmail.com> wrote: >>> >> >> >> >>> > I receive this error: >>> >> >> >> >>> > This result object does not return rows. It has been >>> >> >> >> >>> > closed >>> >> >> >> >>> > automatically. >>> >> >> >> >>> >>> >> >> >> >>> there's a lot of weird situations which can cause that >>> >> >> >> >>> error, >>> >> >> >> >>> usually >>> >> >> >> >>> when using a connection that has had some failure condition >>> >> >> >> >>> occur >>> >> >> >> >>> upon >>> >> >> >> >>> it which renders the connection unusable until either a >>> >> >> >> >>> transaction >>> >> >> >> >>> is >>> >> >> >> >>> rolled back or sometimes the connection needs to be >>> >> >> >> >>> discarded. >>> >> >> >> >>> We >>> >> >> >> >>> can't diagnose it without a full example that reproduces it >>> >> >> >> >>> as >>> >> >> >> >>> well >>> >> >> >> >>> as >>> >> >> >> >>> the complete stack trace. >>> >> >> >> >>> >>> >> >> >> >>> >>> >> >> >> >>> > >>> >> >> >> >>> > >>> >> >> >> >>> > >>> >> >> >> >>> > суббота, 27 января 2018 г., 1:09:53 UTC+3 пользователь >>> >> >> >> >>> > Mike >>> >> >> >> >>> > Bayer >>> >> >> >> >>> > написал: >>> >> >> >> >>> >> >>> >> >> >> >>> >> On Fri, Jan 26, 2018 at 4:21 PM, Евгений Рымарев >>> >> >> >> >>> >> <rymarev...@gmail.com> wrote: >>> >> >> >> >>> >> > Hello, everyone! >>> >> >> >> >>> >> > Engine: >>> >> >> >> >>> >> > engine = create_engine( >>> >> >> >> >>> >> > >>> >> >> >> >>> >> > >>> >> >> >> >>> >> > >>> >> >> >> >>> >> > >>> >> >> >> >>> >> > >>> >> >> >> >>> >> > >>> >> >> >> >>> >> > >>> >> >> >> >>> >> > 'mssql+pymssql://{LOGIN}:{PASSWORD}@{HOST}/{DATABASE}?charset={CHARSET}'.format(**DATABASE), >>> >> >> >> >>> >> > isolation_level='READ COMMITTED' >>> >> >> >> >>> >> > ) >>> >> >> >> >>> >> > >>> >> >> >> >>> >> > >>> >> >> >> >>> >> > My first decorator for session: >>> >> >> >> >>> >> > @decorator_with_args >>> >> >> >> >>> >> > def session_decorator(func, default=None): >>> >> >> >> >>> >> > def wrapper(*a, **kw): >>> >> >> >> >>> >> > s = Session(engine) >>> >> >> >> >>> >> > kw['session'] = s >>> >> >> >> >>> >> > try: >>> >> >> >> >>> >> > return func(*a, **kw) >>> >> >> >> >>> >> > except Exception as e: >>> >> >> >> >>> >> > func(*a, **kw) >>> >> >> >> >>> >> > s.rollback() >>> >> >> >> >>> >> > s.close() >>> >> >> >> >>> >> > logging.error(e) >>> >> >> >> >>> >> > return default >>> >> >> >> >>> >> > finally: >>> >> >> >> >>> >> > s.commit() >>> >> >> >> >>> >> > s.close() >>> >> >> >> >>> >> > return wrapper >>> >> >> >> >>> >> > >>> >> >> >> >>> >> > My second decorator for session: >>> >> >> >> >>> >> > session = scoped_session(sessionmaker(bind=engine)) >>> >> >> >> >>> >> > >>> >> >> >> >>> >> > >>> >> >> >> >>> >> > @decorator_with_args >>> >> >> >> >>> >> > def session_decorator(func, default=None): >>> >> >> >> >>> >> > def wrapper(*a, **kw): >>> >> >> >> >>> >> > kw['session'] = session >>> >> >> >> >>> >> > try: >>> >> >> >> >>> >> > return func(*a, **kw) >>> >> >> >> >>> >> > except Exception as e: >>> >> >> >> >>> >> > session.remove() >>> >> >> >> >>> >> > logging.error(e) >>> >> >> >> >>> >> > return default >>> >> >> >> >>> >> > finally: >>> >> >> >> >>> >> > session.remove() >>> >> >> >> >>> >> > return wrapper >>> >> >> >> >>> >> > >>> >> >> >> >>> >> > In both attempts, I came to the conclusion that >>> >> >> >> >>> >> > sessions >>> >> >> >> >>> >> > can >>> >> >> >> >>> >> > block >>> >> >> >> >>> >> > other >>> >> >> >> >>> >> > sessions. >>> >> >> >> >>> >> > How correctly to create a session once, so that it can >>> >> >> >> >>> >> > be >>> >> >> >> >>> >> > used >>> >> >> >> >>> >> > throughout >>> >> >> >> >>> >> > the web application and no locks were created? >>> >> >> >> >>> >> >>> >> >> >> >>> >> The Session doesn't create locks, transactions and your >>> >> >> >> >>> >> database >>> >> >> >> >>> >> does. >>> >> >> >> >>> >> >>> >> >> >> >>> >> What is the nature of these "blocks", are they deadlocks >>> >> >> >> >>> >> between >>> >> >> >> >>> >> tables or rows? What operations are prevented from >>> >> >> >> >>> >> proceeding? >>> >> >> >> >>> >> Are >>> >> >> >> >>> >> the locks timing out? SQL Server has graphical consoles >>> >> >> >> >>> >> that >>> >> >> >> >>> >> can >>> >> >> >> >>> >> show you this. >>> >> >> >> >>> >> >>> >> >> >> >>> >> What version of SQL Server is this? Do you have >>> >> >> >> >>> >> ALLOW_SNAPSHOT_ISOLATION and READ_COMMITTED_SNAPSHOT >>> >> >> >> >>> >> turned >>> >> >> >> >>> >> on? >>> >> >> >> >>> >> >>> >> >> >> >>> >> >>> >> >> >> >>> >> > >>> >> >> >> >>> >> > -- >>> >> >> >> >>> >> > 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 post to this group, send email to >>> >> >> >> >>> >> > sqlal...@googlegroups.com. >>> >> >> >> >>> >> > 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 sqlalchemy+...@googlegroups.com. >>> >> >> >> >>> > To post to this group, send email to >>> >> >> >> >>> > sqlal...@googlegroups.com. >>> >> >> >> >>> > 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 sqlalchemy+...@googlegroups.com. >>> >> >> >> > To post to this group, send email to >>> >> >> >> > sqlal...@googlegroups.com. >>> >> >> >> > 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 sqlalchemy+...@googlegroups.com. >>> >> >> > To post to this group, send email to sqlal...@googlegroups.com. >>> >> >> > 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 sqlalchemy+...@googlegroups.com. >>> >> > To post to this group, send email to sqlal...@googlegroups.com. >>> >> > 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 sqlalchemy+...@googlegroups.com. >>> > To post to this group, send email to sqlal...@googlegroups.com. >>> > 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 sqlalchemy+...@googlegroups.com. >>> To post to this group, send email to sqlal...@googlegroups.com. >>> 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 sqlalchemy+unsubscr...@googlegroups.com. > To post to this group, send email to sqlalchemy@googlegroups.com. > 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 sqlalchemy+unsubscr...@googlegroups.com. To post to this group, send email to sqlalchemy@googlegroups.com. Visit this group at https://groups.google.com/group/sqlalchemy. For more options, visit https://groups.google.com/d/optout.