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)
Если строковое значение в другом столбце содержит цифры и, возможно, пробелы, вам может потребоваться рассмотреть обрезку или вместо того, чтобы отличать строковое значение до целого числа (и оставить целочисленный столбец целым числом).