【问题标题】:SQLAlchemy Basic QuestionSQLAlchemy 基本问题
【发布时间】:2011-01-13 17:47:45
【问题描述】:

对于任何有 SQLAlchemy 经验的人,我相信这将是基本的;但是我没有找到有用的文档,而且我已经厌倦了摸不着头脑。

给定两个类:

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

class UserPost(Base):
    __tablename__='posts'
    id = Column(Integer, primary_key=True)
    poster = Column(Integer, ForeignKey('users.id'))
    subject = Column(String(32))

我追求的是一种方法:

post = session.query(UserPost).filter_by(subject="foo").one()
print post.poster.name
>>> "John Doe"

我正在尝试使用 relation() 属性进行此操作,但我一直在绕圈子,出现关于连接关系等的错误:S

我的关系如下:

class UserPost(Base):
    __tablename__='posts'
    id = Column(Integer, primary_key=True)
    poster = Column(Integer, ForeignKey('users.id'))
    subject = Column(String(32))
    poster_user = relation(User, primaryjoin=poster==User.id)

我是 SQLAlchemy 巫毒的新手,所以要温柔! :)

提前感谢各位,如果这变成 RTFM 或错误的棒端,请提前道歉

【问题讨论】:

    标签: python orm sqlalchemy


    【解决方案1】:

    我认为你只是把关系定义倒过来了。

    试试:

    class User(Base):
        __tablename__='users'
        id = Column(Integer, primary_key=True)
        name = Column(String(32))
        posts = relation("UserPost", backref="poster")
    
    class UserPost(Base):
        __tablename__='posts'
        id = Column(Integer, primary_key=True)
        user_id = Column(Integer, ForeignKey('users.id'))
        subject = Column(String(32))
    

    【讨论】:

    • 请原谅我,在你的例子中,'backref="poster"' 来自/关联到哪里?
    • backref 表示将向 UserPost 添加“海报”属性。实际上,我可能会称那个“用户”。但关键是,'relation()' 知道如何连接这两个表,因为之前定义了 ForeignKey。
    【解决方案2】:

    也许你应该从elixir 开始,它为 sqlalchemy 提供了一个更简单的接口:

    from elixir import *
    
    metadata.bind = 'sqlite:///:memory:'
    
    class User(Entity):
        name = Field(String(32))
        posts = OneToMany('Post')
    
    class Post(Entity):
        subject = Field(String(32))
        user = ManyToOne('User')
    
    setup_all(True)
    
    u1 = User(name='John Doe')
    p1 = Post(subject='foo', user=u1)
    
    session.commit()
    
    print Post.query.filter_by(subject='foo').one().user.name
    >>> John Doe
    

    【讨论】:

    • Elixir 看起来很有希望。我宁愿理解 SQLAlchemy before 添加另一层 API ;)
    【解决方案3】:

    为什么不显示你是如何配置的 relation() ?这可能是不工作的部分。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-07
      • 2012-03-17
      • 1970-01-01
      • 2011-05-27
      • 2013-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多