Python sqlalchemy postgresql,其中int=string

Python sqlalchemy postgresql,其中int=string,python,sqlite,postgresql,sqlalchemy,Python,Sqlite,Postgresql,Sqlalchemy,我对postgresql没有任何经验,我正在使用sqlalchemy将一个用python编写的应用程序部署到带有postgres的服务器上 为了开发,我使用了一个sqlite服务器 事情进展得很顺利,但我遇到了一个难题,我不知道如何解决 我有三张这样的桌子 class Car(db.Model): id= db.Column(db.Integer, primary_key=True) ... class Truck(db.Model): id= db.Column

我对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
     ...
我有一个从
车辆
中选择的查询,其中
类型='car'和值=10
这将抛出一个错误:
sqlalchemy.exc.ProgrammingError:(ProgrammingError)运算符不存在:integer=字符变化

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

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

现在看来是这样

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
     ...
db.session.query(Vehicle.filter)(Car.id==Vehicle.value)


PS:卡车id必须是字符串,汽车id必须是int。我无法控制它。

只需转换为字符串:

db.session.query(Vehicle).filter(str(Car.id) == Vehicle.value)
from sqlalchemy.sql.expression import cast

db.session.query(Vehicle).filter(cast(Car.id, sqlalchemy.String) == Vehicle.value)
如果
Car.id
是一个int型局部变量

如果需要在联接中使用此选项,请让数据库将其转换为字符串:

db.session.query(Vehicle).filter(str(Car.id) == Vehicle.value)
from sqlalchemy.sql.expression import cast

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

如果另一列中的字符串值包含数字和可能的空白,则可能需要考虑修剪,或者将字符串值转换为整数(并将整数列保留为整数)。p> @chaft:If

Truck.id
包含一个表示整数的字符串,即只包含数字(可能包含前导/尾随空格),并且可以转换为整数,那么你最好转换
Truck.id::int
,而不是相反(
Car.id::varchar
)。还请注意,如果字符串包含前导/尾随空格,则会得到不同的结果,因为在转换为
integer
时会将其修剪,但在比较
varchar
text
时会产生差异。