Order of named parameters

"Peter Hansack" <[email protected]>
Newsgroups gmane.comp.python.sybase
Message-ID <[email protected]>
Sybase ASE uses parameters positional (in the order they are defined in
ct_param) - even named parameters.

An example:

----------------------
import Sybase

db = Sybase.connect('SYBASE','sa','',database='data',auto_commit=1)

db.execute('''create table test (
   key1    varchar(10)     not null,
   value1  varchar(10)     null,
   value2  varchar(10)     null,
   value3  varchar(10)     null,
   value4  varchar(10)     null,
   value5  varchar(10)     null  )
	   ''')

# 1 #
v = { '@key1'   : 'key1',   '@value1' : 'value1', '@value2' : 'value2',
      '@value3' : 'value3', '@value4' : 'value4', '@value5' : 'value5'}
print "v=", v

c = db.cursor()

# 2 #
c.execute('insert into test values
(@key1,@value1,@value2,@value3,@value4,@value5)',v)

# 3 #
c.execute('select * from test')
x = c.fetchone()
print "x=", x

# 4 #
c.execute('''select * from test where key1=@key1 and value1=@value1
             and value2=@value2 and value3=@value3 and value4=@value4
	     and value5=@value5''',v)

y = c.fetchone()
print "y=", y

c.close()
db.close()
----------------------


Running the example gives the following output:

v= {'@key1': 'key1', '@value4': 'value4', '@value5': 'value5', '@value2':
'value2', '@value3': 'value3', '@value1': 'value1'}
x= ('key1', 'value4', 'value5', 'value2', 'value3', 'value1')
y= ('key1', 'value4', 'value5', 'value2', 'value3', 'value1')


Conclusion:
# 3 # shows, that in insert the parameters are applied not in the order of #
2 #, but in the order
shown in # 1 # (i.e in the incidental internal order of the dictionary) and
# 4 # shows, that this is
true also for where-clauses.


Consequence: a patch (for 0.36)

# diff Sybase.py.original Sybase.py
246a247,249
> import re
> re_params = re.compile(r'@\w+')
>
681c684,685
<             for name, value in params.items():
---
>             for name in re_params.findall(sql):
>                 value = params[name]

This helps only in cursor.execute(); the rest of the module should be
checked also.


Question: Is anybody using this module?


Regards,

- Peter
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.