2

編集私は答えを見つけましたが、それはモデルのセットアップ方法とは関係ありません。request.formfrom フラスコを実際にアドレスを作成する関数に渡そうとしました。どうやらそれを変換すると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()

これが基本的な質問である場合は申し訳ありません。助けてくれてありがとう!

4

3 に答える 3

1

答えが見つかりましたが、モデルのセットアップ方法とは関係ありません。request.form をフラスコから実際にアドレスを作成する関数に渡そうとしました。どうやらそれをkwargsに変換すると問題が発生します。各引数を手動で指定すると、すべてが正しく機能しました。

于 2012-07-31T21:22:23.150 に答える
0

などの値を出力してみましたaddress['address1']か? reprおそらく最も明確です。

[編集]

ドキュメントを見た後、次のようにするべきかどうか疑問に思います。

from sqlalchemy import and_
filter(and_(address1 == address['address1'], city == address['city'], ...))
于 2012-07-14T01:14:52.040 に答える
0

あなたのクラス定義は、あなたが提供しなかった大量のセットアップコードをモジュロとして、私のために働いています。以下のコードの量についてお詫び申し上げます。まず、定義:

from sqlalchemy import create_engine, Column, Integer, String, Float
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()

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)

    #note I am only initializing the querying columns. i am lazy   
    def __init__(self, cm, a1, ct, st):
        self.comment = cm
        self.address1 = a1
        self.city = ct
        self.state = st

そのクラス定義をファイル MyAddr.py に入れてインポ​​ートし、python を起動します。SAデモごとにsqliteを使用していることに注意してください。

>>> from sqlalchemy import create_engine
>>> engine = create_engine('sqlite:///:memory:', echo=False)
>>> from sqlalchemy.orm import sessionmaker
>>> Session = sessionmaker(bind=engine)
>>> from MyAddr import Base, Address
>>> Base.metadata.create_all(engine)
>>> 
>>> a = '1234 Main St.'
>>> c = 'Anywhere'
>>> st= 'MO'
>>> cm= 'Blah blah blah blah blah'
>>> 
>>> addr = Address(cm, a, c, st)
>>> 
>>> s = Session()
>>> s.add(addr)
>>> s.commit()
>>> 
>>> q = s.query(Address).filter_by(address1=a,city=c)
>>> 
>>> q.one()
<op.Address object at 0x10d158a50>
>>> q = s.query(Address).filter_by(address1=a,city=c,state=st)
>>> q.one()
<op.Address object at 0x10d158a50>
>>> abc = q.one()
>>> abc
<op.Address object at 0x10d158a50>
>>> abc.city
u'Anywhere'
>>> abc.state
u'MO'
>>> abc.address1
u'1234 Main St.'

クラス定義機能する可能性があるため、質問には(私にとって)十分な情報がなく、機能しない理由を知ることができません。おそらくそれはあなたの入力データに何かありますか?エラー メッセージには 2 組の引用符が含まれており、1 つはエスケープされています。入力辞書に引用符で囲まれた文字列が含まれていますか?

于 2012-07-14T03:28:20.110 に答える