SQLAlchemy基本问题

时间:2010-02-05 23:00:42

标签: python orm sqlalchemy

对于有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或错误的结尾,请提前道歉

3 个答案:

答案 0 :(得分:2)

我认为你只是向后关系定义。

尝试:

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))

答案 1 :(得分:1)

也许你应该从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

答案 2 :(得分:0)

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