[python-sybase] Order of named parameters

Peter Hansack hansack.p at online.de
Mon, 29 Dec 2003 23:36:40 +0100


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