psycopg2 does not attempt to resolve parameters if none are passed:
sql = '''select cast('100%' as varchar) as expected'''
I believe this is done so that the output of .mogrify() may be passed to .execute() without a second attempt to resolve parameters where '%' may be in the data.
momoko attempts to resolve parameters even if none are passed:
momoko_cursor = (yield db.execute(sql)) # fails
momoko_cursor = (yield db.execute(sql.replace('%', '%%')) # passes
Thanks for the bug report. You are welcome to try master branch. I'll release 2.2.3 later this week.