Sqlalchemy postgresql где int = string

У меня есть 0 опыт работы с postgresql и развертывание приложения, написанного на python, с использованием sqlalchemy на сервере с 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 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 dev и продуктом pgsql?

в настоящее время выглядит так:

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

PS: Идентификатор грузовика должен быть строкой, а идентификатор автомобиля должен быть int. Я не контролирую это.

Ответ 1

Просто добавьте строку:

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)

Если строковое значение в другом столбце содержит цифры и, возможно, пробелы, вам может потребоваться рассмотреть обрезку или вместо того, чтобы отличать строковое значение до целого числа (и оставить целочисленный столбец целым числом).