使用基类的属性/属性作为表列?

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
Run Code Online (Sandbox Code Playgroud)

然后我在添加gold属性时继续子类化这个类:

# my_plugin.py

class MyPlayer(game_engine.Player, Base):
    gold = Column(Integer)
Run Code Online (Sandbox Code Playgroud)

现在我需要将播放器存储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)
Run Code Online (Sandbox Code Playgroud)

但是,这是一个长镜头......

sqlalchemy.exc.ArgumentError: Mapper Mapper|Player|player could not assemble any primary key columns for mapped table 'player'
Run Code Online (Sandbox Code Playgroud)

Jul*_*ian 2

这比您想象的要简单。下面的解决方案大致相当于 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)
Run Code Online (Sandbox Code Playgroud)