我正在编写一个基于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)。
有什么想法吗?谢谢!
答案 0 :(得分:1)
您可以通过init方法执行此操作,尽管我建议您反对。
您的代码段有两个问题。
self
参数作为__init__
方法的第一个参数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)