2012-02-22 46 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