PL / Python的。如何在clouse为整数的地方使用无类型?

时间:2018-02-14 09:49:20

标签: python postgresql plpython

所以,我的查询与下面相同:

query = plpy.prepare(
    "SELECT count(id) FROM contracts WHERE dependent_id = $1",  
    ["integer"])

params = [dependent_id]

plpy.execute(query, params)

如果我的字段dependent_id不是None,则效果很好。 但是,如果我在此字段中有None,则查询工作不正确。 与=

比较时,ISNULL不同

我尝试使用if-else表达式来更正我的查询字符串,但是当查询包含IS时,我会抓住语法异常。

在我使用IS关键字记录我的查询后(当我的字段为None时),我在PSQL shell中执行了它,并且它运行良好。

那么,为什么IS不能在plpythonu存储过程中工作,但仍然在本机SQL查询中工作?

更新

我在工作中与DBA进行过讨论,他认为plpythonu中有类型转换的错误。因为plpy.execute在我们尝试使用整数类型的IS时会出现异常。

在您将字段声明为整数并在准备步骤的查询中使用IS之后,您将在执行步骤中获得语法异常。

解决方法是查询字符串,明确指出您的None字段为IS NULLIS NOT NULL

P.S。抱歉我的英文。

1 个答案:

答案 0 :(得分:1)

您可以尝试准备两个单独的SQL语句来处理Python的动态类型:

query = plpy.prepare("SELECT count(id) FROM contracts WHERE dependent_id = $1",  ["integer"]) if dependant_id is not None else plpy.prepare("SELECT count(id) FROM contracts WHERE dependent_id IS NULL",  [])

if dependant_id is None:
   plpy.execute(query, [])
else:
   plpy.execute(query, [dependant_id])