SQLAlchemy Основной вопрос - PullRequest
       9

SQLAlchemy Основной вопрос

3 голосов
/ 06 февраля 2010

Для любого, кто имеет опыт работы с 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 ]

2 голосов
/ 13 февраля 2010

Я думаю, что у вас просто есть определение отношения в обратном направлении.

Попытка:

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 голос
/ 06 февраля 2010

Возможно, вам следует начать с эликсира , который предоставляет более простой интерфейс для 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
0 голосов
/ 06 февраля 2010

Почему бы не показать, как у вас настроены отношения ()? Это, вероятно, та часть, которая не работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...