2016-07-28 4 views
6

ゲームエンジンがsteamidプロパティでPlayerクラスで私を提供(C++から来て、これはそれがPythonでどのように見えるかの単なる基本的な例です):基本クラスのプロパティ/属性を表の列として使用しますか?

私は、このクラスをサブクラスに進みgold属性追加しているとき:

# my_plugin.py 

class MyPlayer(game_engine.Player, Base): 
    gold = Column(Integer) 

を今私は、プレイヤーのgoldプレイヤーのsteamidプレーヤーを識別するための主キーとして使用してデータベースへの格納する必要があります。 SQLAlchemyに、基本クラスのsteamidプロパティをプライマリキーとして使用するように指示するにはどうすればよいですか?ここで

は、私が試した愚かな何か:

from sqlalchemy.ext.declarative import declarative_base 
from sqlalchemy.ext.hybrid import hybrid_property 

import game_engine 

Base = declarative_base() 

class Player(game_engine.Player, Base): 
    __tablename__ = 'player' 

    _steamid = game_engine.Player.steamid 

    @hybrid_property 
    def steamid(self): 
     return type(self)._steamid.__get__(self) 

しかし、これはこれはclassical mapping

from sqlalchemy import Column, Integer, Table 
from sqlalchemy.orm import mapper 
from sqlalchemy.ext.hybrid import hybrid_property 


class MyPlayer(Player): 
    def __init__(self, steamid, gold): 
     super().__init__(steamid) 
     self.gold = gold 
     self._steamid = super().steamid 


player = Table('player', Base.metadata, 
    Column('_steamid', Integer, primary_key=True), 
    Column('gold', Integer), 
) 


mapper(MyPlayer, player) 

答えて

2

を使用して行うことができ

sqlalchemy.exc.ArgumentError: Mapper Mapper|Player|player could not assemble any primary key columns for mapped table 'player' 
+0

私はこの解決法がこれを行う "正しい"方法だと思っていますが、個人的にはr-m-nの答えを使用することになります。私はこれがSOのガイドラインに沿っていることを願っています... –

+0

ガイドラインは100%明確ではありませんが、それはあなたの恩恵です。最も重要なことは、あなたが賞金をすべて授与したということです。私はまだ受け入れに感謝しています。 – Julian

+0

2番目の考えでは、r-m-nのソリューションを使う理由を明確にすることができますか?私には、それは自己罰のようだ... – Julian

1

ええ、それは...ロングショットでしたあなたが期待するよりも簡単です。以下の解は、r-m-nのものとおおよそ同等ですが、現代的な宣言的マッピングを使用しているため、より簡単です。 @hybrid_propertyの必要はありません。ただ親クラスからsteamidを継承することができます。

# my_plugin.py 

class MyPlayer(game_engine.Player, Base): 

    def __init__(self, steamid, gold): 
     super().__init__(steamid) 
     self._id = self.steamid 
     self.gold = gold 

    _id = Column('steamid', Integer, primary_key=True) 
    gold = Column(Integer) 
+1

これは機能しますが、必要以上に複雑です。宣言的なマッピングと '@ hybrid_property'を使わずに同じ結果を得ることができます。私の答えを見てください。 – Julian

+0

私は間違っていて、 'super()。steamid'は実際に働きます(セッターのためだけではないので)、' self._steamid = super()。steamid'を取り除いて 'defスチーム(自己):代わりにスーパー()。スチームドを 'hybrid_property'として返す!私はまた、古典的なマッピング*をとにかく使用するようになります*巨大な量の非準拠のコードのため、答えに感謝! :)私は@ジュリアンからの他の答えがより適切な方法であるように感じるので、私はあなたのものを受け入れなかったが、あなたがこの時間をもっと助けてくれたので、私はあなたに100の報酬を与えた。 –

+0

二次的に、この答えで 'hybrid_property'を使用していないようです。それは間違いでしたか? –

関連する問題