通过主键进行SQLAlchemy初始化

时间:2019-03-18 13:56:52

标签: python sqlalchemy

我正在编写一个基于sqlalchemy的python应用。我想覆盖sqlalchemy的init方法,该方法将接受主键,然后将其初始化为自己的实例。

类似的东西:

class User(Base):
    id = Column(String, primary_key=True)
    name = Column(String)

    def __init__(id):
        self = session.query(User).filter(User.id=id).first()

我知道我可以使用session.query初始化对象,但是我想导出一个很好的简单api,供其他用户使用(它将是一个SDK)。

有什么想法吗?谢谢!

1 个答案:

答案 0 :(得分:1)

可以通过init方法执行此操作,尽管我建议您反对。

您的代码段有两个问题。

  1. 您忘记了将self参数作为__init__方法的第一个参数
  2. 分配给自己是行不通的,但是您可以将self的词典替换为其他词典

将这两件事放在一起:

class User(Base):
    __tablename__ = 'users'
    id = Column(Integer, primary_key=True)
    name = Column(String)

    def __init__(self, user_id):
        res = session.query(User).filter(User.id == user_id).first()
        self.__dict__ = res.__dict__

但是,我建议针对这种非常特定但经常重复的用法添加类方法,即通过primary_key从数据库获取实例

@classmethod
def get_by_id(cls, key):
    return session.query(cls).filter(cls.id == key).first()

这种方式对于所有具有单个列主键的类都是通用的。

这些版本的用法是

u1 = User(user_id=1)
u2 = User.get_by_id(key=1)