【问题标题】:Python and MySQLdb: substitution of table resulting in syntax errorPython 和 MySQLdb:替换表导致语法错误
【发布时间】:2012-03-12 18:01:32
【问题描述】:

我需要时不时动态地改变表和变量,所以我写了一个这样的python方法:

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

但是这会导致语法错误异常。我尝试调试它,所以我打印了方法中的变量并手动填充它们,这很有效。所以我不确定我做错了什么?

是因为我尝试使用表格的替代品吗?

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

【问题讨论】:

    标签: python mysql-python


    【解决方案1】:

    DB API 中的参数替换仅适用于值,而不适用于表或字段。您需要对这些使用普通的字符串替换:

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

    请注意,值占位符有一个双精度 % - 这是为了在初始字符串替换时将其单独保留。

    【讨论】:

    • 如果我理解正确的话,它会用字符串替换 %s 并且它只会去掉 %%s 的 % 符号?
    • 顺便说一句,显然您需要在替换为字符串后对 selectQ 进行类型转换,但这可能是因为我还使用了一些整数。
    • 这是否记录在某处?在像SHOW COLUMNS FROM Table 这样的查询中,将Table 视为参数并非没有道理。 (但是 +1 的答案。这是一个很难搜索的问题。)
    【解决方案2】:

    这是一个完整的工作示例

    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()           
    

    【讨论】:

    • def inswk(table, total, date, tick): import MySQLdb as mdb import sys con = None try: con = mdb.connect(host, user, password, db); cur = con.cursor() selectq = """INSERT INTO %s (price, date,ticker) VALUES (%%s, %%s, %%s)""" % (table) cur.execute(selectq, (总数、日期、刻度))
    【解决方案3】:

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

    Ed:NM,丹尼尔回答得更快更完整

    【讨论】:

      【解决方案4】:

      你的意思是写:

      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)
      

      这只是字符串格式的错误?

      顺便说一句,您为什么要为这种工作编写显式 SQL?更好地使用神奇的sqlalchemy 进行 python sql 操作..

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-04-19
        • 2013-12-15
        • 1970-01-01
        • 2012-07-11
        • 1970-01-01
        • 2017-06-07
        • 1970-01-01
        相关资源
        最近更新 更多