2012-02-22 39 views
5

我需要动态地改变表和变量不时,所以我写一个python方法是这样的:Python和MySQLdb的:导致语法错误表的取代

selectQ ="""SELECT * FROM %s WHERE %s = %s;""" 
    self.db.execute(selectQ,(self.table,self.columnSpecName,idKey,)) 
    return self.db.store_result() 

然而这会导致一个语法错误例外。我试着调试它,所以我打印方法中的变量并手动填充它们,并且工作。所以我不确定我做错了什么?

是因为我试着用表的替代品吗?

另外我该如何调试mysqldb,以便将替代查询打印为字符串?

回答

10

DB API中的参数替换仅适用于值 - 不是表或字段。你需要使用普通字符串替换那些:

selectQ ="""SELECT * FROM %s WHERE %s = %%s;""" % (self.table,self.columnSpecName) 
self.db.execute(selectQ,(idKey,)) 
return self.db.store_result() 

注意价值占位符具有双重% - 这是这样,它是由最初的字符串替换单独留在家中。

+0

如果我理解正确的话它会用细绳代替%s和它只会落一%% s的%符号? – 2012-02-22 12:14:04

+0

是的,这是正确的。 – 2012-02-22 12:14:28

+0

非常感谢你:) – 2012-02-22 12:16:20

-3

你的意思写:

selectQ = """SELECT * FROM %s WHERE %s = %s;""" % (self.table,self.columnSpecName,idKey) #maybe the idkey should be self.idkey? don't know the rest of the code 

self.db.execute(selectQ) 

而这仅仅是与字符串格式化的错误呢?

Btw为什么你会为这类工作写明确的SQL?更好地使用神奇的sqlalchemy进行python sql操作..

0

您必须使用字符串替换来添加表和列名称,驱动程序将只处理参数。

埃德:NM,丹尼尔回答更快更彻底

1

这是一个完整的工作示例

def rtnwkpr(tick, table, col): 

    import MySQLdb as mdb 
    tickwild = tick + '%'  
    try: 
     con = mdb.connect(host, user, password, db); 
     cur = con.cursor() 
     selectq = "SELECT price FROM %s WHERE %s LIKE %%s;" % (table, col) 
     cur.execute(selectq,(tickwild)) 
     return cur.fetchall()   
+0

def inswk(table,total,date,tick):import MySQLdb as mdb import sys con = None try:con = mdb.connect(host,用户,密码,db); cur = con.cursor()selectq =“”“INSERT INTO%s(price,date,ticker)VALUES(%% s,%% s,%% s)”“”%(表)cur.execute(selectq, (总计,日期,勾号)) – 2012-05-29 21:38:50