PS: for postgresql, it's nasty ... placeholders are in "python" notation, so
db.executesql('select * from %s', placeholders=('example')) or db.executesql('select * from %(tablename)s', placeholders={'tablename' : 'example'}) works. If payback types is passed as a string, you need to add a % to retain the quoted template, I guess payback_types = ('s','p') query_string = """ select sum(happen_amount) from cash_journal where distributor_id = 1 and transaction_type in %(types)s and extract(epoch from (%%s - happen_time)) < %%s;""" % { 'types': str(payback_types) } lockAmount = self.db.executesql(query_string, placeholders=(now, seconds)) or payback_types = ('s','p') query_string = """ select sum(happen_amount) from cash_journal where distributor_id = 1 and transaction_type in %(types)s and extract(epoch from (%%(now)s - happen_time)) < %%(seconds)s;""" % { 'types': str(payback_types) } lockAmount = self.db.executesql(query_string, placeholders=dict(now=now, seconds=seconds)) should work as intended.