Python sqlalchemy postgresql,其中int=string
我对postgresql没有任何经验,我正在使用sqlalchemy将一个用python编写的应用程序部署到带有postgres的服务器上 为了开发,我使用了一个sqlite服务器 事情进展得很顺利,但我遇到了一个难题,我不知道如何解决 我有三张这样的桌子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
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
时会产生差异。