Python / MySQL IN列表错误:AttributeError:' tuple'对象没有属性'键'

时间:2017-01-18 01:50:26

标签: python sqlalchemy

我试图动态构建条形码的IN列表以传递给我的查询。我在另一个StackOverflow帖子中找到了一个技巧,让我这样做。但是,我的数据库引擎不断抛出错误。它是Python 2.7和MySQL 5.1。

bc_list = ['850351589', '850351541']
in_list = ','.join(['%s'] * len(bc_list))

sql = """
        SELECT col1,
        col2,col3
        FROM table
        WHERE 1=1
        AND col1 IN (%s)
      """ % in_list
rs = db.session.execute(sql, tuple(bc_list), bind=db.get_engine(current_app, 'mysql_db_uri'))

1 个答案:

答案 0 :(得分:0)

感谢@Paul Rooney指出第二个参数预期字典,而不是元组。我错误地将MySQL python执行文档打开正在阅读错误的文档!无论如何,这是我非常不优雅的解决方案。我对Flask& amp; SQLAlchemy的。我正在使用遗留应用程序,由于我无法控制的一些糟糕的表架构设计,因此无法使用ORM。 (基本上约束没有正确设置所以我不能在不改变数百万+行表的情况下进行JOIN)所以我必须使用原始sql进行此查询。无论如何,这是我的解决方案。

bc_list = ['850351589', '850351541']
in_list = "" # (:bc1, :bc2, :bc3, ...)
bc_dict = {} # { bc1: bc1, bc2: bc2, ... }
for index, item in enumerate(bc_list, start=1):
    bc = ":bc" + str(index)
    in_list += "," + bc if index > 1 else bc
    bc_dict["bc" + str(index)] = item

sql = """
        SELECT
          q.barcode_no,
          l.vrt_number,
          l.lot_no,
          l.project,
          l.scientist,
          l.cmpd_weight,
          q.quantity,
          ROUND((100000*q.quantity)/l.cmpd_weight,2) AS solvate_vol
        FROM
          compound_lot l,
          sample_quantity q
        WHERE
          q.sample_id = l.sample_id AND
          q.barcode_no  IN ({})""".format(in_list)

#return sql
#return jsonify(bc_dict)

rs = db.session.execute(sql, bc_dict)