我试图动态构建条形码的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'))
答案 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)