Mar*_*nen 6 python inheritance sqlalchemy properties python-3.x
一个游戏引擎为我提供了一个Player带有steamid属性的类(来自C++,这只是一个关于它在Python中的样子的基本示例):
# game_engine.py
class Player:
    def __init__(self, steamid):
        self.__steamid = steamid
    @property
    def steamid(self):
        return self.__steamid
然后我在添加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)
但是,这是一个长镜头......
sqlalchemy.exc.ArgumentError: Mapper Mapper|Player|player could not assemble any primary key columns for mapped table 'player'
这比您想象的要简单。下面的解决方案大致相当于 rmn 中的解决方案,但更简单,因为它使用现代声明性映射。不需要,继承父类@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)