@@ -100,33 +100,54 @@ def execute(self, sql, *args, **kwargs):
100100 # Determine paramstyle, name
101101 _paramstyle , name = _parse_placeholder (token )
102102
103- # Ensure paramstyle is consistent
104- if paramstyle is not None and _paramstyle != paramstyle :
105- raise RuntimeError ("inconsistent paramstyle" )
106-
107103 # Remember paramstyle
108- if paramstyle is None :
104+ if not paramstyle :
109105 paramstyle = _paramstyle
110106
107+ # Ensure paramstyle is consistent
108+ elif _paramstyle != paramstyle :
109+ raise RuntimeError ("inconsistent paramstyle" )
110+
111111 # Remember placeholder's index, name
112112 placeholders [index ] = name
113113
114- # In case user passes args in list or tuple
115- if len (args ) == 1 and (isinstance (args [0 ], list ) or isinstance (args [0 ], tuple )) and len (placeholders ) != 1 :
116- args = args [0 ]
114+ # If more placeholders than arguments
115+ if len (args ) == 1 and len (placeholders ) > 1 :
116+
117+ # If user passed args as list or tuple, explode values into args
118+ if isinstance (args [0 ], (list , tuple )):
119+ args = args [0 ]
120+
121+ # If user passed kwargs as dict, migrate values from args to kwargs
122+ elif len (kwargs ) == 0 and isinstance (args [0 ], dict ):
123+ kwargs = args [0 ]
124+ args = []
125+
126+ # If no placeholders
127+ if not paramstyle :
128+
129+ # Error-check like qmark if args
130+ if args :
131+ paramstyle = "qmark"
132+
133+ # Error-check like named if kwargs
134+ elif kwargs :
135+ paramstyle = "named"
117136
118- # In case user passes kwargs in dict
119- if len (args ) == 1 and len (kwargs ) == 0 and isinstance (args [0 ], dict ) and len (placeholders ) != 1 :
120- kwargs = args [0 ]
137+ # In case of errors
138+ _placeholders = ", " .join ([str (tokens [index ]) for index in placeholders ])
139+ _args = ", " .join ([str (self ._escape (arg )) for arg in args ])
140+ #_kwargs = ", ".join([str(self._escape(arg)) for arg in args])
121141
122142 # qmark
123143 if paramstyle == "qmark" :
124144
125145 # Validate number of placeholders
126- if len (placeholders ) < len (args ):
127- raise RuntimeError ("too few placeholders" )
128- elif len (placeholders ) > len (args ):
129- raise RuntimeError ("too many placeholders" )
146+ if len (placeholders ) != len (args ):
147+ if len (placeholders ) < len (args ):
148+ raise RuntimeError ("fewer placeholders ({}) than values ({})" .format (_placeholders , _args ))
149+ else :
150+ raise RuntimeError ("more placeholders ({}) than values ({})" .format (_placeholders , _args ))
130151
131152 # Escape values
132153 for i , index in enumerate (placeholders .keys ()):
@@ -138,8 +159,8 @@ def execute(self, sql, *args, **kwargs):
138159 # Escape values
139160 for index , name in placeholders .items ():
140161 i = int (name ) - 1
141- if i < 0 or i >= len (args ):
142- raise RuntimeError ("placeholder out of range" )
162+ if i >= len (args ):
163+ raise RuntimeError ("placeholder (:{}) greater than number of values ({})" . format ( name , _args ) )
143164 tokens [index ] = self ._escape (args [i ])
144165
145166 # named
@@ -148,17 +169,18 @@ def execute(self, sql, *args, **kwargs):
148169 # Escape values
149170 for index , name in placeholders .items ():
150171 if name not in kwargs :
151- raise RuntimeError ("missing value for placeholder" )
172+ raise RuntimeError ("missing value for placeholder (:{})" . format ( name ) )
152173 tokens [index ] = self ._escape (kwargs [name ])
153174
154175 # format
155176 elif paramstyle == "format" :
156177
157178 # Validate number of placeholders
158- if len (placeholders ) < len (args ):
159- raise RuntimeError ("too few placeholders" )
160- elif len (placeholders ) > len (args ):
161- raise RuntimeError ("too many placeholders" )
179+ if len (placeholders ) != len (args ):
180+ if len (placeholders ) < len (args ):
181+ raise RuntimeError ("fewer placeholders ({}) than values ({})" .format (_placeholders , _args ))
182+ else :
183+ raise RuntimeError ("more placeholders ({}) than values ({})" .format (_placeholders , _args ))
162184
163185 # Escape values
164186 for i , index in enumerate (placeholders .keys ()):
@@ -170,7 +192,7 @@ def execute(self, sql, *args, **kwargs):
170192 # Escape values
171193 for index , name in placeholders .items ():
172194 if name not in kwargs :
173- raise RuntimeError ("missing value for placeholder" )
195+ raise RuntimeError ("missing value for placeholder (:{})" . format ( name ) )
174196 tokens [index ] = self ._escape (kwargs [name ])
175197
176198 # Join tokens into statement
0 commit comments