sqlalchemy postgresql其中int = string

app*_*ief 11 python sqlite postgresql sqlalchemy

我有0次使用postgresql的经验,并且使用sqlalchemy将一个用python编写的应用程序部署到带有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
     ...
Run Code Online (Sandbox Code Playgroud)

我有一个查询,从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.我无法控制.

Mar*_*ers 24

简单地转换为字符串:

db.session.query(Vehicle).filter(str(Car.id) == Vehicle.value)
Run Code Online (Sandbox Code Playgroud)

if Car.id是一个int的局部变量.

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

from sqlalchemy.sql.expression import cast

db.session.query(Vehicle).filter(cast(Car.id, sqlalchemy.String) == Vehicle.value)
Run Code Online (Sandbox Code Playgroud)

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