編集私は答えを見つけましたが、それはモデルのセットアップ方法とは関係ありません。request.form
from フラスコを実際にアドレスを作成する関数に渡そうとしました。どうやらそれを変換するとkwargs
問題が発生します。各引数を手動で指定すると、すべてが正しく機能しました。
私は SQLAlchemy を初めて使用し、これまでのところ順調に進んでいますが、問題が発生して完全に困惑しているので、ここの誰かが私が間違っていることを知っていることを願っています!
アドレス モデルがあり、そこから選択しようとしています。モデルは次のようになります。
class Address(Base):
__tablename__ = 'address'
id = Column(Integer, primary_key=True)
comment = Column(String(255))
address1 = Column(String(100))
address2 = Column(String(100))
city = Column(String(45))
state = Column(String(2))
zip = Column(String(5))
zip4 = Column(String(4))
lat = Column(Float)
lon = Column(Float)
アプリケーションから入力された住所の要素を照合して、ジオコーディングなしで緯度と経度を見つけられるかどうかを確認しようとしています。私はfilter_by
うまくいった他のクエリで使用したので、ここで同じことを試しています:(address
辞書はポストパラメータからアプリケーションに送られます)
matched_address = session.query(Address).filter_by(
address1=address['address1'],
city=address['city'],
state=address['state'],
zip=address['zip']
).one()
残念ながら、これは SQL エラーで失敗しています:
ProgrammingError: (ProgrammingError) (1064, 'You have an error in your SQL syntax;
check the manual that corresponds to your MySQL server version for the right
syntax to use near \') AND address.state = ("\'XX\'",) AND address.zip =
("\'XXXXX\'",) AND address.city \' at line 3')
これは非常に醜く見えます!余分なものはどこ()
から来るのですか?echo=True
への呼び出しでオンにするcreate_engine()
と、正しいと思われるクエリが出力されます(問題なくmysqlクライアントで試しました):
SELECT address.id AS address_id, address.comment AS address_comment,
address.address1 AS address_address1, address.address2 AS address_address2,
address.city AS address_city, address.state AS address_state,
address.zip AS address_zip, address.zip4 AS address_zip4,
address.lat AS address_lat, address.lon AS address_lon
FROM address
WHERE address.address1 = %s AND address.state = %s AND address.zip = %s AND
address.city = %s
LIMIT %s
しかし、それが出力していると言っているパラメータは少し奇妙に思えますが、これが単なる python オブジェクトなのか、それとも本当にこのように MySQL に行くのかはわかりません: (X 文字は私の実際のアドレスの単なる置き換えであることに注意してください)
([u'1111 XXXXXX St'], [u'XX'], [u'XXXXX'], [u'XXXXX'], 1)
楽しみのためにfilter()
代わりに使用してみましfilter_by()
たが、同じエラーが発生します。
matched_address = database.session.query(Address).filter(
and_(Address.address1==address['address1'], Address.city==address['city'],
Address.state==address['state'],Address.zip==address['zip'])).one()
これが基本的な質問である場合は申し訳ありません。助けてくれてありがとう!