2

我有一个我在 windows 盒子上为 python 2.7 编写的脚本。我让它在几台不同的机器上工作,所以我知道它“移动”正常。

我现在正在设置一个 ubuntu 盒子(v12.04)。

相同的代码在 ubuntu 中失败:

instance = session.query(formats_table).\
filter(formats_table.c.formatid==FormatID, 
       formats_table.c.puid==PUID, 
       formats_table.c.formatversion==FormatVersion, 
       formats_table.c.formatmimetype==FormatMIMEType).all()

在 Windows 中它运行良好并且没有问题

在ubuntu中它失败了:

TypeError: <lamba>() takes exactly 2 arguments (5 given)

我该怎么做才能找出问题所在?

我假设这条线被解析为 5 个不同的参数,而不是两个 (session.query) 和 (filter),这表明括号没有被正确解析?

4

1 回答 1

3

你有两个不同版本的 SQLAlchemy。

SQLAlchemy 的filter方法:

filter(*criterion)

使用 SQL 表达式将给定的过滤条件应用于此查询的副本。

例如: session.query(MyClass).filter(MyClass.name == 'some name')

多个条件由 AND 连接在一起(0.7.5 中的新功能)

session.query(MyClass).filter(MyClass.name == 'some name', MyClass.id > 5)

请注意,在 0.7.5 之前,您不能在一次filter调用中拥有多个标准——您必须链接多个filter调用才能获得相同的效果。在你的情况下,这看起来像:

instance = session.query(formats_table).\
filter(formats_table.c.formatid==FormatID).\
filter(formats_table.c.puid==PUID).\
filter(formats_table.c.formatversion==FormatVersion).\
filter(formats_table.c.formatmimetype==FormatMIMEType)

因此,所引用的“参数”是传递给的关键字参数filter——在你的 Ubuntu 版本附带的 SQLAlchemy 版本中只能有一个,而你提供了四个。您看不到的另一个参数是self调用实例方法时自动传递的实例对象(通常称为 )。

于 2012-05-27T06:01:03.863 回答