5

私が使用しているのは、SQLAlchemy 0.7.9 および Python 2.7.3 with Bottle 0.11.4 です。私はPythonのアマチュアです。

次のような宣言ベースから派生したクラス(多くの列を持つ)があります。

class Base(object):

     @declared_attr
     def __tablename__(cls):
             return cls.__name__.lower()

     id = Column(Integer, primary_key = True)

     def to_dict(self):
             serialized = dict((column_name, getattr(self, column_name))
                     for column_name in self.__table__.c.keys())
             return serialized

Base = declarative_base(cls=Base)


class Case(Base):

     version                 = Column(Integer)
     title                   = Column(String(32))
     plausible_dd            = Column(Text)
     frame                   = Column(Text)
     primary_task            = Column(Text)
     secondary_task          = Column(Text)
     eval_objectives         = Column(Text)
     ...

現在、ボトルでこの「ルート」を使用して、次のようにjsonで行/クラスをダンプしています。

@app.route('/<name>/:record')
def default(name, record, db):
    myClass = getattr(sys.modules[__name__], name)
    parms = db.query(myClass).filter(myClass.id == record)
    result = json.dumps(([parm.to_dict() for parm in parms]))
    return result

私の最初の質問は次のとおりです。列を反復処理してその値と適切な名前を取得できるように、各列に適切な名前として使用できる静的テキストを含めるにはどうすればよいですか? 例えば:

class Case(Base):
     version    = Column(Integer)
     version.pn = "Version Number" 

私の 2 番目の質問は次のとおりです。この例を見たことがありますが、説明がわかりません。

sqlalchemy.orgの例:

      id = Column("some_table_id", Integer)

例の私の解釈:

      version   = Column("Version Number", Integer)

明らかに、テーブル列を作成したくありません。列に一般的な意味での「属性」を持たせたいだけです。前もって感謝します。

4

1 に答える 1

4

そのために情報辞書を使用することができます。モデルクラスで、次のように定義します。

class Case(Base):
    version = Column(Integer, info={'description': 'Version Number'})

次に、テーブル列のプロパティとしてアクセスできます。

desc = Case.__table__.c.version.info.get('description', '<no description>')

アップデート

これは、テーブル内のすべての列を反復処理して、それらの名前、値、および説明を取得する1つの方法です。この例では、Python2.7以降で使用可能なdict理解を使用しています。

class Case(Base):
    # Column definitions go here...

    def as_dict(self):
        return {c.name: (getattr(self, c.name), c.info.get('description'))
                for c in self.__table__.c}
于 2012-12-31T23:05:04.303 に答える