代码之家  ›  专栏  ›  技术社区  ›  Aiden Bell

炼金术基本问题

  •  3
  • Aiden Bell  · 技术社区  · 16 年前

    对任何有炼金术经验的人来说,我相信这是最基本的;但是我觉得这些文件没那么有用,我讨厌挠头。

    分为两类:

    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)
    

    我对炼金术的伏都教还不熟悉,所以温柔一点吧!:)

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

    3 回复  |  直到 16 年前
        1
  •  2
  •   rhettg    16 年前

    我想你只是把关系的定义倒过来了。

    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))
    
        2
  •  1
  •   Mathias Loesch    16 年前

    也许你应该从 elixir

    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
    
        3
  •  0
  •   zeemonkee    16 年前

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