sqlalchemy postgresql其中int = string

时间:2012-09-28 16:14:25

标签: python sqlite postgresql sqlalchemy

我对postgresql有0次经验,并且使用sqlalchemy将使用pylalchemy编写的应用程序部署到带有postgres的服务器。

对于开发,我使用了sqlite服务器。

事情进展顺利,但我遇到了一个不知道如何解决的问题。

我有三张看起来像这样的表

class Car(db.Model):
     id= db.Column(db.Integer, primary_key=True)
     ...

class Truck(db.Model):
     id= db.Column(db.String(32), primary_key=True)
     ...

class Vehicles(db.Model):
     id= db.Column(db.Integer, primary_key=True)
     type= db.Column(db.String) #This is either 'car' or 'truck'
     value= db.Column(db.String) #That's the car or truck id
     ...

我有一个查询从Vehicles中选择type = 'car' AND value = 10 这是一个错误: sqlalchemy.exc.ProgrammingError: (ProgrammingError) operator does not exist: integer = character varying

所以我猜这是因为Car.id是一个int而Vehicle.value是一个字符串..

如何在sqlalchemy中编写此查询?有没有办法编写它并使其与我的sqlite开发环境和pgsql生成兼容?

目前它看起来像那样

db.session.query(Vehicle).filter(Car.id == Vehicle.value)

PS:卡车ID必须是一个字符串,而车辆ID必须是一个int。我无法控制。

1 个答案:

答案 0 :(得分:21)

简单地转换为字符串:

db.session.query(Vehicle).filter(str(Car.id) == Vehicle.value)

如果Car.id是一个int的局部变量。

如果需要在连接中使用它,请让数据库将其强制转换为字符串:

from sqlalchemy.sql.expression import cast

db.session.query(Vehicle).filter(cast(Car.id, sqlalchemy.String) == Vehicle.value)

如果另一列中的字符串值包含数字且可能包含空格,则可能需要考虑修剪,或者将字符串值转换为整数(并将整数列保留为整数)。