1

SQLAlchemyリフレクションを使用して、特定の列のデータをクエリするにはどうすればよいですか?

testtable = Table('member', Metadata, autoload=True)

def TestConnection():
    data = None
    loopCounter = 0 
    for data in session.query(testtable).filter_by(is_active=1, is_deleted=0): 
        print(loopCounter + 1, data)
        loopCounter += 1
    if data is None:
        raise Exception ("Could not find any data that matches your query")        
    else:
        print("It worked!")

TestConnection()

上記のクエリは、 membersテーブルのすべての列のすべてのデータを提供します。ただし、必要なのは、列から特定のデータを取得することです。たとえば、ユーザー名パスワードの列を取得したいのですが、構文を正しく取得できません。以下は私がこれまでに持っているものです:

def TestConnection():
    loopCounter = 0 
    for password, username in session.query(testtable).filter_by(is_active=1, is_deleted=0):
        print(loopCounter + 1, data)
        loopCounter += 1
    if data is None:
        raise Exception ("Could not find any data that matches your query")        
    else:
        print("It worked!")

それはエラーで失敗します:

Traceback (most recent call last):
File "/home/workspace/upark/src/monitor.py", line 36, in <module>
TestConnection()
File "/home/workspace/upark/src/monitor.py", line 26, in TestConnection
for password, username in session.query(testtable).filter_by(is_active=1, is_deleted=0):
ValueError: too many values to unpack (expected 2)

OracleのPython3.2、SQLAchemy0.8、およびmysqlconnectorを使用しています。

編集:若干の進歩

次のようにすべての結果が返された後、列を「フィルター」で除外できることがわかりました。

def TestConnection():
    data = None
    loopCounter = 0 
    for data in session.query(testtable).filter_by(is_active=1, is_deleted=0): 
        print(loopCounter + 1, data.password, data.username)
        loopCounter += 1
    if data is None:
        raise Exception ("Could not find any data that matches your query")        
    else:
        print("It worked!")

それは与えるでしょう:

1 pass1 userone
2 pass2 usertwo

しかし、ご覧のとおり、それはすべての列を取り戻した後です。私が欲しいのは、必要な列だけからデータをフェッチすることです。たとえば、Membersテーブルには10個の列があります。効率を上げるために、そのうちの2つからデータを取得するだけで済みます。

4

1 に答える 1

2

session.query(testtable.c.password, testtable.c.username)テーブル全体 [ ] ではなく、列を指定して [ ] を選択するだけsession.query(testtable)です。

def TestConnection():
    data = None
    loopCounter = 0 
    for data in session.query(testtable.c.password, testtable.c.username).filter_by(is_active=1, is_deleted=0): 
        pwd, usr = data
        print(loopCounter + 1, pwd, usr)
        loopCounter += 1
    if data is None:
        raise Exception ("Could not find any data that matches your query")        
    else:
        print("It worked!")
于 2013-03-05T16:57:52.813 に答える