Flask SQLAlchemy:如何将列表传入IN绑定参数:songs?
解决SQLAlchemy中列表/元组作为IN参数绑定的问题
嘿,这个问题我之前踩过同款坑!你遇到的AttributeError原因很明确:SQLAlchemy的connection.execute()方法,当你用带命名参数(比如:songs)的SQL语句时,第二个参数必须是键值对形式的字典,而你直接传了元组songs,它会尝试调用这个对象的keys()方法(因为默认期望映射类型),但列表/元组根本没有这个方法,所以就触发报错了。
修复步骤超简单:
把你的元组包装成字典,键就是SQL里的参数名:songs,对应的值就是你的歌曲列表/元组。只需要修改connection.execute()这一行:
songs = ('Song1', 'Song2', 'Song3', 'Song4', 'Song5') engine = app.db.engine connection = engine.connect() rawSqlResult = text( "SELECT * FROM AlbumView WHERE Song IN :songs") # 核心修改:将songs包装为字典传入 queryResult = connection.execute(rawSqlResult, {"songs": songs}) tempDict, resultList = {}, [] for rowproxy in queryResult: for tup in rowproxy.items(): tempDict = {**tempDict, **{tup[0]: tup[1]}} resultList.append(tempDict) print(resultList)
额外小提醒:
完全不用手动把列表拼接成('Song1','Song2')这种字符串再插入SQL,SQLAlchemy会自动帮你处理IN子句的参数绑定,既安全(避免SQL注入风险)又省心——不管你传的是列表还是元组,都能正常解析工作。
内容的提问来源于stack exchange,提问作者ali_t_k
相关产品推荐
相关产品推荐

