From: Peter H. <han...@on...> - 2003-12-30 17:36:48
|
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 |