Thanks. I’ll pursue those avenues. Cheers, Ian
2019년 4월 1일 (월) 11:30, Mike Bayer <mike...@zzzcomputing.com>님이 작성: > On Sun, Mar 31, 2019 at 10:12 PM Ian Wagner <ianthetec...@gmail.com> > wrote: > > > > > > My suggestion would be a pymssql dialect-level patch to send bytestrings > for String columns, and of course continue passing str/unicode for Unicode > columns. I'm on the mailing list looking for help with why my solution > doesn't work as intended with enums (see my GitHub repo). For the moment, > I've actually just implemented this column myself as shown, and replaced > all String columns with it (rather than "replacing" String using colspecs), > and banned all devs on our project from using the regular String column > type until it's fixed. > > Please just use a TypeDecorator for all your String columns where this > issue is apparent: > > class UTF8String(TypeDecorator): > impl = String > > def process_bind_param(self, value, dialect): > if value is not None: > value = value.encode(dialect.encoding) > return value > > next, the issue should be reported to pymssql, where they should > likely include options to modify this behavior: > > https://github.com/pymssql/pymssql > > next, I need this to be confirmed as an issue for pyodbc. As my > understanding is that Microsoft is funding Pyodbc's development I'd > like to see what their approach to this issue is. > > *if* it is truly the canonical solution that applications that code > against these DBAPIs *must* send byte arrays in order to avoid > crushing performance costs, the drivers need to make that clear. > then we can look into introducing either flags or permanent behavior > such that we encode all Python unicode objects for a *non unicode* > String datatype under the MSSQL dialects. > > > > > > >> Also note pymssql is not well maintained right now due to lack of > >> funding > > > > > > Noted. We'll look into switching drivers yet again, but the official > driver lacked several features the last time we evaluated it (I think > stored proc output parameters were not supported, and it would require > quite a few syntax changes in areas where we have to write raw SQL). > > > > Cheers, > > Ian > > > > On Friday, March 29, 2019 at 11:10:21 PM UTC+9, Mike Bayer wrote: > >> > >> Also note pymssql is not well maintained right now due to lack of > >> funding, please confirm you reproduce your performance concerns using > >> PyODBC with Microsofts ODBC drivers ? That should be considered to be > >> the canonically supported driver right now, works on all platforms > >> very well now. > >> > >> On Fri, Mar 29, 2019 at 10:07 AM Mike Bayer <mik...@zzzcomputing.com> > wrote: > >> > > >> > OK so I saw that the "N" prefix is not generated with your test case > >> > either, so I re-read your email. Can you clarify what you mean by > >> > "always encoded as NVARCHAR"? are you referring to the simple fact > >> > that a Python string object is passed to the driver, and that the > >> > driver is behind the scenes applying the "N" in any case or is > >> > otherwise binding it as unicode in such a way that performance is > >> > impacted? SQLAlchemy for many years passed bytestrings to drivers > >> > like pyodbc because they would simply crash if you passed them a > >> > unicode object, but once they supported it, SQLAlchemy was eager to > >> > get out of the business of doing this encoding. In 1.3 we've just > >> > deprecated all the flags that allow it to do this > >> > (convert_unicode=True). Using that flag would be your quickest way > >> > to get it back for now but we'd have to develop an all new behavior > >> > for 1.4 if we are to start encoding these binds again, however current > >> > behavior has been this way for many years and this is the first it's > >> > being reported in this way. I would want to look into driver > >> > configuration options for this as well. > >> > > >> > > >> > > >> > > >> > On Fri, Mar 29, 2019 at 9:56 AM Mike Bayer <mik...@zzzcomputing.com> > wrote: > >> > > > >> > > On Fri, Mar 29, 2019 at 6:20 AM Ian Wagner <ianthe...@gmail.com> > wrote: > >> > > > > >> > > > Hello all, > >> > > > > >> > > > I'm trying to get to the bottom of an issue in which Python 3 > (unicode by definition) strings are always encoded as NVARCHAR for at least > two backends (pymssql and pyodbc). Using bytstrings as comparison arguments > (for example Table.column == value.encode('utf-8')) sends a regular string > literal as expected, but regular strings are encoded as NVARCHAR literals. > >> > > > > >> > > > This behavior is fairly logical at the underlying driver (pymssql > or pyodbc) level, which is why I'm posting here. I believe the the use of a > String column (as opposed to a Unicode column) type should not pass an > NVARCHAR literal. Doing so has disastrous performance implications, as SQL > Server ends up casting the whole column up. This will wreak havoc when > regularly dealing with large-ish tables (1.7 million rows or so in our > case). > >> > > > > >> > > > I have previously posted with a LOT more details on StackOverflow > ( > https://stackoverflow.com/questions/55098426/strings-used-in-query-always-sent-with-nvarchar-syntax-even-if-the-underlying-c). > I also have an MCVE over on GitHub ( > https://github.com/ianthetechie/pymssql_sqlalchemy_55098426). > >> > > > > >> > > > In my MCVE, I outline a possible approach for fixing this, but it > appears to have some problems. I'm posting here asking for feedback on > what's wrong with my approach, and what would be the best way to go about > getting this fixed. > >> > > > >> > > seems like we will need some documentation for this as it is > confusing > >> > > a lot of people. The issue that introduced this behavior is > >> > > https://github.com/sqlalchemy/sqlalchemy/issues/4442 and then that > >> > > same user felt it was happening too often in > >> > > https://github.com/sqlalchemy/sqlalchemy/issues/4561, however I > >> > > clarified that the N prefix only generates if there is no other > >> > > context to determine that this is not a non-unicode context. > >> > > > >> > > the NVARCHAR thing should not happen if you are comparing to a > >> > > non-NVARCHAR column. it only occurs when there is no other context > >> > > that SQLAlchemy can determine the correct datatype for the Unicode > >> > > object being passed. > >> > > > >> > > However, the example case you have on github there seems to be > using a > >> > > unicode in a VARCHAR comparison so should not see the N. If it > does, > >> > > it's a bug. I will try your test case now. > >> > > > >> > > In the future, please go straight to the SQLAlchemy github issue > >> > > tracker with a succinct test case, as this N thing is obviously > still > >> > > ongoing. > >> > > > >> > > > >> > > > >> > > > > >> > > > Thanks! > >> > > > Ian > >> > > > > >> > > > -- > >> > > > 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 sqlal...@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 a topic in the > Google Groups "sqlalchemy" group. > To unsubscribe from this topic, visit > https://groups.google.com/d/topic/sqlalchemy/eCpCRzuZxFs/unsubscribe. > To unsubscribe from this group and all its topics, 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. > -- Like Sudoku? Check out my free app "Endless Sudoku" on the App Store <http://itunes.apple.com/app/endless-sudoku/id492773309> or Google Play <https://play.google.com/store/apps/details?id=com.ianthetechie.endless_sudoku> ! Games aren't your thing? How about an awesome GPS that you can wear on your wrist? Check out Pebble Pilot GPS <http://www.pebblegps.com/>. It's legit. -- 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.