12

私はpostgresqlの経験がなく、sqlalchemyを使用してPythonで記述されたアプリをpostgresを使用するサーバーにデプロイしています。

開発には、sqliteサーバーを使用しました。

物事はかなり順調に進んでいますが、解決方法がわからないという問題にぶつかりました。

私はそのように見える3つのテーブルを持っています

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
     ...

これがエラーをスローしている Vehicles場所から選択するクエリがあります:type = 'car' AND value = 10sqlalchemy.exc.ProgrammingError: (ProgrammingError) operator does not exist: integer = character varying

Car.idですから、これはintでVehicle.valueあり、stringであるためだと思い ます。

sqlalchemyでこのクエリを書く方法は?それを書いて、私のsqlite開発環境とpgsqlプロダクションと互換性を持たせる方法はありますか?

現在はそのように見えます

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

PS:トラックIDは文字列で、車IDは整数である必要があります。私にはそれを制御することはできません。

4

1 に答える 1

34

単純に文字列にキャストします。

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

ifCar.idは int のローカル変数です。

これを結合で使用する必要がある場合は、データベースに文字列にキャストさせます。

from sqlalchemy.sql.expression import cast

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

他の列の文字列値に数字と空白が含まれている場合は、トリミングを検討するか、代わりに文字列値を整数にキャストする (整数列を整数のままにする) 必要があります。

于 2012-09-28T16:26:31.283 に答える