On Mon, Oct 8, 2018 at 9:56 AM Mike Bayer <mike...@zzzcomputing.com> wrote:

>
>
> On Mon, Oct 8, 2018 at 10:28 AM Lukasz Szybalski <szybal...@gmail.com>
> wrote:
>
>>
>> I have a query in sqlalchemy like below where I lookup contract# in
>>>>>> mssql. How do I enforce the varchar instead of nvarchar? I tried 
>>>>>> converting
>>>>>> my field to "str(mycurrent)" but that didn't do anything. Is there some
>>>>>> other spot to force VARCHAR to be sent?
>>>>>>
>>>>>
>>>>>
>>>>> this just came up in
>>>>> https://bitbucket.org/zzzeek/sqlalchemy/issues/4161/sql-server-string-use-case,
>>>>> in that case they are using typed parameters:
>>>>>
>>>>> String(50, convert_unicode='force')
>>>>>
>>>>> if you're dealing w/ the raw string like that try this:
>>>>>
>>>>> execute(text("select ... where foo =
>>>>> :mycurrent").bindparams(bindparam("mycurrent",
>>>>> type_=String(convert_unicode='force')))
>>>>>
>>>>> let me know if that works b.c. this has to be in the docs
>>>>>
>>>>
>
> you need to use the text() construct as I illustrated earlier:
>
> session.execute(
>     text("select ... where foo =
> :mycurrent").bindparams(bindparam("mycurrent",
> type_=String(convert_unicode='force')),
>     params={"mycurrent": "value"}
> )
>
>
>
>
>
>
>>
>>
>>> You can find that the query that uses NVARCHAR does an index scan has
>>> 30,909 logical reads on the dbo.P table.  It also uses 890 ms of CPU and
>>> has a total elapsed time of 938 ms.
>>>
>>> The query that uses VARCHAR does an index seek and has 7 logical reads
>>> on the dbo.P table.  It uses 0 ms of CPU and has a total elapsed time of 11
>>> ms.
>>>
>>>
>>>  p=*session.execute*("select PZ.p_id,PZ.pimage_num from dbo.P
>>> with(nolock) inner join dbo.PZ PZ with(nolock) on PZ.p_id = p.p_id  inner
>>> join dbo.D D with(nolock) on D.p_id = p.p_id AND D.pimage_num=PZ.pimage_num
>>> where p.current=:mycurrent and D.srtype_id
>>> =5",params={'mycurrent':str(mycurrent)}).fetchall()
>>>
>>>
>>>
>>>
>>>
>>> [image: Inline image 1]
>>>
>>>
>>>
>>>
SUPER FAST..now.!!!
(I wonder what would be a side effect if this was done by default? aka user
varchar)

For Reference: I'll I split into two lines because for some reason I was
making some mistake and had to google my way out of it.

Version1 (easier to understand and test)

*from sqlalchemy import text, bindparam,String*
#  ":mycontract" and "mycontract" parts bound by the bindparams to create a
statemetn query.
*# item in bold is what is required to get it to convert from nvarchar to
varchar*
stmt= text("select P.contract_id from dbo.P P with(NOLOCK) where
currentstatus_id in (1,2) and current_cuntract=:mycontract").
*bindparams(bindparam("mycontract",type_=String(50,convert_unicode='force')))*
#We now execute the statement from above and bind it to a variable I'm
passing row.mycontract from our forloop.
p=session.execute(stmt,params={'mycontract':row.mycontract}).fetchall()

This causes the value to be varchar instead of nvarchar which fixes mssql :
"NVARCHAR cause performance downgrade because NVARCHAR literals do not use
VARCHAR indexes. When we add convert_unicode='force' all our N'something'
turns into 'something' and gains performance from indexes."
https://bitbucket.org/zzzeek/sqlalchemy/issues/4161/sql-server-string-use-case

**Can you post above as comment to bitbucket ticket. I can't register it
says "are you sure you are not a robot" with no other option ;) lol . I
guess they don't get many new accounts lol

Thank you sqlalchemy!
Lucas
-- 
http://lucasmanual.com/ <http://lucasmanual.com/blog/>



>
>>
>>
>> --
>> SQLAlchemy -
>> The Python SQL Toolkit and Object Relational Mapper
>>
>> http://www.sqlalchemy.org/
>>
>

-- 
http://lucasmanual.com/ <http://lucasmanual.com/blog/>

-- 
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.

Reply via email to