Regarding the client side issue, people have been reporting problems with pyODBC’s behavior compared to native .NET in my issue for pyODBC. Worth a look, but quite hard to understand.
On Sat, 17 Oct 2020 at 23.29, Varun Madiath <vam...@gmail.com> wrote: > I just want to comment that I have used pyodbc with Exasol before, so > there is at least once other ODBC driver that is used in conjunction with > pyodbc. > However I later switched to using turbodbc since the performance was much > better that with pyodbc, so maybe Mike is right about the real world use > cases. > > > On Sat, Oct 17, 2020 at 1:52 PM Mike Bayer <mike...@zzzcomputing.com> > wrote: > >> We also have a reproduction case and at least plans to document using the >> new hook to workaround, up at >> https://github.com/sqlalchemy/sqlalchemy/issues/5651 . >> >> however what is quite unusual is that while we can reproduce the error >> connecting directly to the database with the collation, if we run an INSERT >> to that table from *another* database, specifying the table as >> otherdb.dbo.table, then the error does *not* occur. which indicates >> there's some client-side thing going on that can globally "fix" the >> problem, or perhaps the data is going in incorrectly, not sure. >> >> >> >> On Sat, Oct 17, 2020, at 6:13 AM, Nicolas Lykke Iversen wrote: >> >> Let's close this issue. Since pyODBC isn't going to fix anything and >> claims that SQLAlchemy should use it correctly, Mike's custom >> set_input_sizes()is the way to solve this problem. >> >> @Mike, having read your description of set_input_sizes(), I guess the >> reason why Simon's version worked for my single-threaded POC application >> and failed for my multiprocessing application, is that the POC inserts >> only a single value (the string), while the other inserts multiple values - >> sounds right? >> >> I will drop the _SC collation until I explicitly needs in my application >> for string operations, while probably will happen in the future. >> >> Thanks Mike and Simon for your great support. >> On Friday, October 16, 2020 at 10:22:45 PM UTC+2 Mike Bayer wrote: >> >> >> >> On Fri, Oct 16, 2020, at 10:25 AM, Simon King wrote: >> >> Yep, I misunderstood what setinputsizes was doing. I thought it told >> pyodbc how it should handle a particular datatype, >> >> >> that would be great if it worked that way :) however alas... >> >> >> >> >> >> rather than telling >> it how to handle the set of parameters it is about receive in the next >> execute() call... >> >> Sorry for adding to the confusion, >> >> >> no worries at all. this has to be the first time I've ever seen an >> inaccuracy from your part, looking forward to the next one 15 years from >> now :) >> >> >> >> >> >> >> >> Simon >> >> On Fri, Oct 16, 2020 at 1:14 PM Mike Bayer <mik...@zzzcomputing.com> >> wrote: >> > >> > >> > >> > On Fri, Oct 16, 2020, at 3:53 AM, Nicolas Lykke Iversen wrote: >> > >> > Is it really necessary to use your very-subtle vendored version of the >> set_input_sizes() hook? Why use it compared to Simon King's simple version? >> > >> > >> > yes, because cursor.setinputsizes() must be passed an entry for every >> bound parameter in your statement, in the order that they will be passed to >> cursor.execute(). this includes for all the numerics, dates, etc for >> which you certainly don't want to pass those as "varchar". so if the >> third parameter in your statement was the textual version, you'd need to >> pass cursor.setinputsizes([None, None, (pyodbc.SQL_WVARCHAR, None, None), >> ...]). Also in my experimenation with this value you want to pass "None" >> for length, if not otherwise specified, and not 0. >> > >> > Simon's version is hardcoding to passing varchar in all cases for a >> single bound parameter, and I would not expect that recipe to work at all. >> > >> > >> > Using Simon King's version I experience a weird issue: it works >> perfectly, when using a single-threaded application, but when using >> multiprocessing it doesn't work. >> > >> > In particular, if I execute: >> > >> > engine = sqlalchemy.create_engine( >> > f'mssql+pyodbc://{user}:{pwd}@ >> {host}:{port}/{db}?driver=ODBC+Driver+17+for+SQL+Server', >> > pool_size=5, >> > max_overflow=10, >> > pool_pre_ping=True, >> > isolation_level='READ_UNCOMMITTED', >> > pool_recycle=900, >> > echo=debug, >> > connect_args={'connect_timeout': 10} >> > ) >> > >> > @sqlalchemy.event.listens_for(engine, 'before_cursor_execute') >> > def receive_before_cursor_execute(conn, cursor, statement, parameters, >> context, executemany): >> > cursor.setinputsizes([(pyodbc.SQL_WVARCHAR, 0, 0), ]) >> > >> > in the main application and: >> > >> > def db_init(): >> > engine = common.db.Session.get_bind() >> > engine.dispose() >> > >> > in all the children, then the hook gets called in the children, but >> somehow doesn't affect the INSERTs - the original error is produced for >> strings with a. length longer than 2000 characters. >> > >> > Best regards >> > Nicolas >> > >> > >> > >> > On Thursday, October 15, 2020 at 7:39:08 PM UTC+2 Mike Bayer wrote: >> > >> > >> > >> > On Thu, Oct 15, 2020, at 3:26 AM, Nicolas Lykke Iversen wrote: >> > >> > Hi Mike, >> > >> > I have created an issue for pyodbc: >> https://github.com/mkleehammer/pyodbc/issues/835#issuecomment-708930870 >> > >> > I've gotten really good feedback there from Microsoft, and a fix has >> been proposed that works: >> > >> > "You can try to use setinputsizes on your parameter to tell it to send >> as varchar(max): cursor.setinputsizes([(pyodbc.SQL_WVARCHAR,0,0),])" >> > I'm by no means an SQLAlchemy expert, but shouldn't the pyodbc dialect >> be updated to support varchar(max)using the proposed method? If not, how >> can I execute cursor.setinputsizes([(pyodbc.SQL_WVARCHAR,0,0),]) using >> SQLAlchemy, so that I can make use of varchar(max)in my application? >> > >> > >> > >> > SQLAlchemy has some dialects that make use of setinputsizes() out of >> necessity, but it's an area that is fraught with issues as it means >> SQLAlchemy is second-guessing what the DBAPI is coming up with. >> > >> > It's actually news to me that pyodbc supports setinputsizes() as >> historically, the cx_Oracle DBAPI was the only DBAPI that ever did so and >> this method is usually not supported by any other DBAPI. We have a hook >> that calls upon setinputsizes() but right now it's hardcoded to cx_Oracle's >> argument style, so the hook would need alterations to support different >> calling styles on different dialects. >> > >> > In >> https://github.com/mkleehammer/pyodbc/issues/835#issuecomment-709385941 >> it is suggested that there should be no need to use this "_SC" collation - >> then in >> https://github.com/mkleehammer/pyodbc/issues/835#issuecomment-709428774, >> you stated "I previously experimented with non-_SC in my application, and >> it caused errors.". Can you be more specific of these errors? At the >> moment, this is suggesting a major architectural rework of the pyodbc >> dialect to support a use case which has other workarounds. The >> architecture of SQLAlchemy's set_input_sizes() hook has changed and at best >> this would be part of 1.4 which is not in beta release yet, a production >> release is not for several months. >> > >> > From that point, there's an event hook at do_setinputsizes(): >> https://docs.sqlalchemy.org/en/13/core/events.html?highlight=do_setinputsizes#sqlalchemy.events.DialectEvents.do_setinputsizes >> that would be usable so that you could set up rules like these on your own, >> and we eventually would document the known workarounds for various unusual >> issues. >> > >> > This issue is definitely unusual, it's never been reported and was >> difficult to find in google searches, so I don't believe we are using >> pyodbc incorrectly and it would be nice if pyodbc could someday realize >> that MS SQL Server is the only database anyone really uses their driver >> with, and they could perhaps add a SQL Server ruleset directly. If this >> were a problem that occurred frequently, then we would begin looking into >> turning on some of this behavior by default but we need to be very >> conservative on that as this is an area where things break quite a lot. >> > >> > Below is the recipe that includes a directly vendored version of the >> set_input_sizes() hook to suit your immediate use case. that's what I can >> get you for now and it will allow you to set the input sizes any way you'd >> like. >> > >> > import pyodbc >> > >> > from sqlalchemy import Column >> > from sqlalchemy import create_engine >> > from sqlalchemy import event >> > from sqlalchemy import Integer >> > from sqlalchemy import String >> > from sqlalchemy.ext.declarative import declarative_base >> > from sqlalchemy.orm import Session >> > >> > >> > Base = declarative_base() >> > >> > e = create_engine( >> > "mssql+pyodbc://scott:tiger^5HHH@mssql2017 >> :1433/test?driver=ODBC+Driver+13+for+SQL+Server", >> > echo=True, >> > ) >> > >> > >> > @event.listens_for(e, "before_cursor_execute") >> > def before_cursor_execute( >> > conn, cursor, statement, parameters, context, executemany >> > ): >> > >> > if not hasattr(context.compiled, "bind_names"): >> > return >> > >> > inputsizes = {} >> > for bindparam in context.compiled.bind_names: >> > # check for the specific datatype you care about here >> > if bindparam.type._type_affinity is String: >> > inputsizes[bindparam] = ((pyodbc.SQL_WLONGVARCHAR, 0, 0),) >> > else: >> > inputsizes[bindparam] = None >> > >> > positional_inputsizes = [] >> > for key in context.compiled.positiontup: >> > bindparam = context.compiled.binds[key] >> > dbtype = inputsizes.get(bindparam, None) >> > positional_inputsizes.append(dbtype) >> > >> > cursor.setinputsizes(positional_inputsizes) >> > >> > >> > class A(Base): >> > __tablename__ = "a" >> > >> > id = Column(Integer, primary_key=True) >> > x = Column(Integer) >> > data = Column(String) >> > y = Column(Integer) >> > >> > Base.metadata.drop_all(e) >> > Base.metadata.create_all(e) >> > >> > s = Session(e) >> > >> > s.add(A(data="some data", x=1, y=4)) >> > s.commit() >> > >> > >> > >> > >> > >> > >> > >> > >> > >> > >> > >> > >> > >> > >> > >> > Can you recommend a hotfix for using varchar(max)in current SQLAlchemy >> applications that need to handle Unicode supplementary characters (_SC)? >> > >> > I appreciate really appreciate your help. >> > >> > Best regards >> > Nicolas >> > On Wednesday, October 14, 2020 at 3:36:11 PM UTC+2 Mike Bayer wrote: >> > >> > >> > >> > On Wed, Oct 14, 2020, at 5:35 AM, Nicolas Lykke Iversen wrote: >> > >> > Hi Mike, >> > >> > I've now tested inserting strings with more than 2000 characters using >> Azure Data Studio (SQL Server GUI) and everything works. >> > >> > Furthermore, I've tested pyodbc (DBAPI) directly, and it only fails >> when inserting such strings using parameterised SQL queries (it succeeds >> without using parametrised queries). >> > >> > >> > that would be expected because all the datatype-related issues occur >> when bound parameters are passed. >> > >> > >> > >> > You can see my POC below, if you have any interest. >> > >> > I guess it should be submitted as a bug to pyodbc... Do you know if I >> can disable parametrisation for certain SQL queries in SQLAlchemy? >> > >> > >> > there is not and this is definitely an issue that has to be solved at >> the pyodbc level, either a bug on their end or something in your >> configuration that has to be changed. >> > >> > >> > >> > >> > >> > >> > Best regards (and thanks for your help and support!!!) >> > Nicolas >> > >> > System info: >> > python v. 3.8.5 >> > pyodbc v. 4.0.30 >> > msodbcsql17 v. 17.6.1.1 >> > >> > POC: >> > import sys >> > import pyodbc >> > >> > host = 'tcp:127.0.0.1,1433' >> > db = 'pyodbc_test' >> > user = 'sa' >> > pwd = 'P@ssw0rd' >> > >> > print('started') >> > >> > cnxn = pyodbc.connect('DRIVER={ODBC Driver 17 for SQL >> Server};SERVER='+host+';DATABASE='+'master'+';UID='+user+';PWD='+ pwd, >> autocommit=True) >> > cursor = cnxn.cursor() >> > >> > try: >> > cursor.execute(f'CREATE DATABASE {db} COLLATE >> Latin1_General_100_CI_AS_SC') >> > except pyodbc.ProgrammingError as e: >> > pass # database exists >> > >> > cursor.execute(f'USE {db}') >> > >> > try: >> > cursor.execute(""" >> > CREATE TABLE msg ( >> > id int identity(1,1) not null, >> > content varchar(max) not null >> > );""") >> > except pyodbc.ProgrammingError as exc: >> > pass # table exists >> > >> > content = 2000 * 'A' >> > >> > cursor.execute(f""" >> > INSERT INTO msg (content) >> > VALUES ('{content}')""") >> > print(f'non-param: {len(content)=}: success') >> > >> > sql = f""" >> > INSERT INTO msg (content) >> > VALUES (?)""" >> > cursor.execute(sql, (content)) >> > print(f'param: {len(content)=}: success') >> > >> > content = 2001 * 'A' >> > >> > cursor.execute(f""" >> > INSERT INTO msg (content) >> > VALUES ('{content}')""") >> > print(f'non-param: {len(content)=}: success') >> > >> > # this fails! >> > sql = f""" >> > INSERT INTO msg (content) >> > VALUES (?)""" >> > cursor.execute(sql, (content)) >> > print(f'param: {len(content)=}: success') >> > >> > >> > #cursor.execute('SELECT * FROM msg') >> > #rows = cursor.fetchall() >> > #for r in rows: >> > # print(r) >> > >> > print('finished') >> > >> > >> > >> > On Wednesday, October 14, 2020 at 12:43:25 AM UTC+2 Mike Bayer wrote: >> > >> > >> > >> > On Tue, Oct 13, 2020, at 4:57 PM, Nicolas Lykke Iversen wrote: >> > >> > Thank you, Mike - very much appreciated! >> > >> > Just to be clear, pyodbc is not a driver, it’s a ODBC-compliant DBAPI, >> right? I separately downloaded a driver for SQL Server from Microsoft, >> which pyodbc makes use of. >> > >> > >> > right the pyodbc is the DBAPI in this case, which we usually refer to >> as a "driver" but in the case of ODBC the "driver" is more specifically the >> separate ODBC driver component. >> > >> > >> > Do you suggest that changing pyodbc to another SQL Server DPAPI would >> solve the problem? >> > >> > >> > I suggest that if there is no issue with the query you're running >> outside of the context of pyodbc that you submit an issue to pyodbc at >> https://github.com/mkleehammer/pyodbc/issues . However I was able to >> find a discussion thread about your error message that seemed to be >> independent of ODBC. >> > >> > >> > >> > >> > >> > If so, can you recommend another DBAPI for SQL Server? Or do you think >> that the problem is caused by Microsoft’s driver? >> > >> > >> > pyodbc is the only supported driver for SQL Server that exists now for >> Python. You also definitely want to use Microsoft's ODBC drivers so >> you're already there. >> > >> > >> > >> > I’m pretty sure SQL Server works fine when accessed using .NET, >> otherwise the Internet would be full of complaints regarding not being able >> to insert +2000 characters in a varchar(max). >> > >> > >> > you'd want to see if the same ODBC driver and options are in use in >> that scenario. >> > >> > >> > >> > >> > >> > Best regards >> > Nicolas >> > >> > >> > On Tue, 13 Oct 2020 at 22.22, Mike Bayer <mik...@zzzcomputing.com> >> wrote: >> > >> > >> > >> > >> > On Tue, Oct 13, 2020, at 10:50 AM, Nicolas Lykke Iversen wrote: >> > >> > Hi SQLAlchemy, >> > >> > System information: >> > >> > Mac OS X v. 10.15.7 >> > Python v. 3.8.5 >> > SQLAlchemy v. 1.3.19 >> > MS SQL Server 2017 and 2019 (both Enterprise and Docker images e.g. >> mcr.microsoft.com/mssql/server:2019-latest) >> > >> > Problem: >> > I have an issue with inserting strings with a length greater than 2000 >> into columns with a datatype of Text, VARCHAR, or NVARCHAR using MS SQL >> Server 2017 and 2019. >> > >> > I've checked the MS SQL Server and it creates it column properly with >> e.g. a datatype of varchar(max)for Text and VARCHAR, which should be able >> to store strings with a size up to 2 GB according to Microsoft >> documentation. >> > >> > Furthermore, I've tried using other collations, but I need _SC >> (supplementary character) support for my applications, so I cannot drop it, >> and adding _UTF8 (UTF-8) doesn't solve the problem either. >> > >> > Why am I not allowed to store strings with a size greater than 2000? >> > >> > >> > I'm not really sure, this has to do with a behavior of SQL Server >> and/or your ODBC driver. a google search finds fairly scant results but >> there is a long discussion regarding this error here: >> https://www.sqlservercentral.com/forums/topic/collation-error-when-adding-distributer >> > >> > >> > >> > >> > >> > >> > >> > >> > And why is SQLAlchemy displaying that error message, when trying to >> insert plain ASCII text ("AAAA...")? >> > >> > >> > SQLAlchemy runs SQL statements using a method called >> "cursor.execute()", which is a feature of the DBAPI (database driver) in >> use. As your error message indicates you're using the pyodbc driver, >> this method is documented here: >> https://github.com/mkleehammer/pyodbc/wiki/Cursor#executesql-parameters >> > >> > The DBAPI execute() method, and most of the other DBAPI methods, can >> throw exceptions if something goes wrong. SQLAlchemy has the policy that >> if it encounters such an exception when it calls cursor.execute(), it wraps >> it in a SQLAlchemy-specific version of that exception (named the same) and >> then throws it. >> > >> > In other words you're using a driver called pyodbc that's creating this >> error. SQLAlchemy just propagates it for you but otherwise has nothing to >> do with how it's produced. >> > >> > >> > >> > >> > I would really appreciate some guidance on how to solve this problem. >> What could be causing it? >> > >> > Error: >> > sqlalchemy.exc.ProgrammingError: (pyodbc.ProgrammingError) ('42000', >> "[42000] [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]Cannot >> convert to text/ntext or collate to 'Latin1_General_100_CI_AS_SC' because >> these legacy LOB types do not support UTF-8 or UTF-16 encodings. Use types >> varchar(max), nvarchar(max) or a collation which does not have the _SC or >> _UTF8 flags. (4189) (SQLParamData)") >> > [SQL: INSERT INTO msg (content) OUTPUT inserted.id VALUES (?)] >> > [parameters: >> ('AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA >> ... (1703 characters truncated) ... >> AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA',)] >> > (Background on this error at: http://sqlalche.me/e/13/f405) >> > >> > >> > Program (POC): >> > import logging >> > import sqlalchemy >> > from sqlalchemy import Column, Text, Integer, NVARCHAR, VARCHAR >> > from sqlalchemy.ext.declarative import declarative_base >> > from sqlalchemy.orm import sessionmaker >> > >> > logging.root.setLevel(logging.DEBUG) >> > >> > Base = declarative_base() >> > >> > >> > class Msg(Base): >> > __tablename__ = 'msg' >> > >> > id = Column(Integer, primary_key=True, autoincrement=True) >> > content = Column(VARCHAR, nullable=False) >> > >> > >> > user = 'sa' >> > pwd = 'P@ssw0rd' >> > host = 'localhost' >> > port = 1433 >> > db = 'test' >> > >> > logging.info('started.') >> > >> > engine = sqlalchemy.create_engine( >> > f'mssql+pyodbc://{user}:{pwd}@ >> {host}:{port}/{db}?driver=ODBC+Driver+17+for+SQL+Server', >> > pool_size=5, >> > max_overflow=10, >> > pool_pre_ping=True, >> > isolation_level='READ_UNCOMMITTED', >> > pool_recycle=900, >> > echo=False, >> > connect_args={'connect_timeout': 10}) >> > >> > Base.metadata.create_all(engine) >> > >> > Session = sessionmaker(bind=engine, autoflush=False, autocommit=False) >> > session = Session() >> > >> > for i in range(10000): >> > try: >> > msg = Msg(content='A' * i) >> > session.add(msg) >> > session.commit() >> > except Exception as exc: >> > logging.exception(f'fail: {i=}: {exc}') >> > break >> > else: >> > logging.info(f'success: {i=}') >> > >> > logging.info('done.') >> > >> > >> > -- >> > 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/ca549391-4360-480e-8c58-06577f6d92dan%40googlegroups.com >> . >> > >> > >> > >> > -- >> > 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 a topic in the >> Google Groups "sqlalchemy" group. >> > To unsubscribe from this topic, visit >> https://groups.google.com/d/topic/sqlalchemy/Kk6DkPNWlR4/unsubscribe. >> > To unsubscribe from this group and all its topics, send an email to >> sqlalchemy+...@googlegroups.com. >> > To view this discussion on the web visit >> https://groups.google.com/d/msgid/sqlalchemy/b4a135ef-1c1e-476c-a3f0-60326dca76ea%40www.fastmail.com >> . >> > >> > >> > -- >> > 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/CAE%2B5CJABrO_459MHtDePMXah8mb67TFvQB8rUwgVgk6%2By4v-ow%40mail.gmail.com >> . >> > >> > >> > >> > -- >> > 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/60f82633-887a-43a3-ac52-c5541058e0bcn%40googlegroups.com >> . >> > >> > >> > >> > -- >> > 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/f3e2a277-8529-4fd5-83be-26445616f6c3n%40googlegroups.com >> . >> > >> > >> > >> > -- >> > 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/f963fe8a-a595-48c5-92a8-597046e199c6n%40googlegroups.com >> . >> > >> > >> > -- >> > 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/783293d6-6130-449a-a77f-28118ef3ef20%40www.fastmail.com >> . >> >> -- >> 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/CAFHwexfqcGGMsYpn4y192qncs7Ka0a0CssLfdnUHJCoWGdMRCQ%40mail.gmail.com >> . >> >> >> >> -- >> 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 view this discussion on the web visit >> https://groups.google.com/d/msgid/sqlalchemy/c2246a7e-9e30-4eb9-8a9a-fe53e3557651n%40googlegroups.com >> <https://groups.google.com/d/msgid/sqlalchemy/c2246a7e-9e30-4eb9-8a9a-fe53e3557651n%40googlegroups.com?utm_medium=email&utm_source=footer> >> . >> >> >> -- >> 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 view this discussion on the web visit >> https://groups.google.com/d/msgid/sqlalchemy/84ea9dfd-216a-4c76-980c-ac03db4d9ddb%40www.fastmail.com >> <https://groups.google.com/d/msgid/sqlalchemy/84ea9dfd-216a-4c76-980c-ac03db4d9ddb%40www.fastmail.com?utm_medium=email&utm_source=footer> >> . >> > -- > 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 a topic in the > Google Groups "sqlalchemy" group. > To unsubscribe from this topic, visit > https://groups.google.com/d/topic/sqlalchemy/Kk6DkPNWlR4/unsubscribe. > To unsubscribe from this group and all its topics, send an email to > sqlalchemy+unsubscr...@googlegroups.com. > To view this discussion on the web visit > https://groups.google.com/d/msgid/sqlalchemy/CADm-oGnuWycLYx-AWN_SxVcgcGSdamEwcHKcThRxbN8UqJ2hFQ%40mail.gmail.com > <https://groups.google.com/d/msgid/sqlalchemy/CADm-oGnuWycLYx-AWN_SxVcgcGSdamEwcHKcThRxbN8UqJ2hFQ%40mail.gmail.com?utm_medium=email&utm_source=footer> > . > -- 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 view this discussion on the web visit https://groups.google.com/d/msgid/sqlalchemy/CAE%2B5CJAT6s3UfNFB9Oz%2BM%2BoMPmQZN13-xgS%2BGo7946%2Beo8H51g%40mail.gmail.com.