11

JSONで特定のテーブルを送信するWebサービスを作成しています。SQLAlchemyを使用してデータベースと通信します。

ユーザーが見る権利のある列だけを取得したいと思います。

一部の列を取得しないようにSQLAlchemyに指示する方法はありますか?それは正しくありませんが、このようなものです:

SELECT * EXCEPT column1 FROM table.

SELECTステートメントで一部の列だけを指定することは可能ですが、すべてのテーブル列がわからないため、正確には指定できません。一部の列を除いて、すべての列が必要です。

また、すべての列を取得して、このようにしたくない列属性を削除しようとしました:

 result = db_session.query(Table).all()
 for row in result:
     row.__delattr(column1)

しかし、SQLAlchemyはこれを許可していないようです。警告が表示されます:

Warning: Column 'column1' cannot be null 
cursor.execute(statement, parameters)
ok

あなたたちのためにそれを行うための最も最適化された方法は何でしょうか?

ありがとうございました

4

3 に答える 3

16

不要な列を除いて、テーブル内のすべての列を query メソッドに渡すことができます。

session.query(*[c for c in User.__table__.c if c.name != 'password'])

実行可能な例を次に示します。

#!/usr/bin/env python

from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String
from sqlalchemy.orm import Session


Base = declarative_base()
class User(Base):
    __tablename__ = 'users'

    id = Column(Integer, primary_key=True)
    name = Column(String)
    fullname = Column(String)
    password = Column(String)

    def __init__(self, name, fullname, password):
        self.name = name
        self.fullname = fullname
        self.password = password

    def __repr__(self):
       return "<User('%s','%s', '%s')>" % (self.name, self.fullname, self.password)

engine = create_engine('sqlite:///:memory:', echo=True)

Base.metadata.create_all(engine)
session = Session(bind=engine)
ed_user = User('ed', 'Ed Jones', 'edspassword')
session.add(ed_user)
session.commit()

result = session.query(*[c for c in User.__table__.c if c.name != 'password']).all()
print(result)
于 2013-01-28T07:47:31.130 に答える
5

列を据え置き列にすることができます。この機能を使用すると、テーブルの特定の列を、クエリを使用してエンティティをクエリするときではなく、直接アクセスするときにのみ読み込むことができます。

遅延列ロードを参照してください

于 2013-01-28T08:31:18.263 に答える