Застрял в SQLAlchemy и объектных отношений - PullRequest
0 голосов
/ 19 ноября 2010

Я просто работаю над простой базой данных адресной книги для изучения sqlalchemy.Это код в файле 'tables.py' (который очень похож на тот, что в учебнике!):

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from sqlalchemy import Column, Integer, String, create_engine, ForeignKey
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import relationship, backref

engine = create_engine('sqlite:///phone.db', echo=True)
Base = declarative_base()

class namesT(Base):

    __tablename__ = 'Names'

    id = Column(Integer, primary_key=True)
    name = Column(String)
    sirname = Column(String)
    job = Column(String)
    work = Column(String)

    def __init__(self, namesTuple):
        self.name, self.sirname, self.job, self.work = namesTuple
        print self.name, self.sirname, self.job, self.work

    def __repr__(self):
        return '%s, %s, %s, %s' % (self.name, self.sirname, self.job, self.work)

class detailT(Base):

    __tablename__ = "Details"

    id = Column(Integer, primary_key=True)
    names_id = Column(Integer, ForeignKey('Names.id'))
    type = Column(String)
    info = Column(String)
    detail = Column(String)

    names = relationship(namesT, backref='Details', order_by=id, cascade="all, delete, delete-orphan")


    def __init__(self, detailsTuple):
        self.type, self.info, self.detail = detailsTuple
        print self.type, self.info, self.detail

    def __repr__(self):
        return "%s, %s, %s" % (self.type, self.info, self.detail)

Base.metadata.create_all(engine)

И это коды в 'dbtrans.py':

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from tables import engine as engine
from tables import namesT as names
from sqlalchemy.orm import sessionmaker

class transaction:
    def __init__(self):
        self.Session = sessionmaker(bind=engine)
        self.session = self.Session()

    def insert_in_names(self, namesTuple):
        print namesTuple
        ed = names(namesTuple)
        self.session.add(ed)
    def find(self):
        self.session.query(names).filter(names.name=='ed').all()

    def commitAll(self):
        self.session.commit()

if __name__ == "__main__":
    tup = ('Blah', 'Blah', 'Blah', 'Blah')
    ins = transaction()
    ins.insert_in_names(tup)
#    print ins.sessQuery()
    ins.commitAll()

Я просто получаю эту ошибку каждый раз, когда запускаю dbtrans:

sqlalchemy.orm.exc.FlushError: Instance <namesT at 0x14538d0> is an unsaved, pending instance and is an orphan (is not attached to any parent 'detailT' instance via that classes' 'names' attribute)

В чем проблема?

Ответы [ 2 ]

1 голос
/ 19 ноября 2010

Пожалуйста, исправьте меня, если я ошибаюсь, но ошибка говорит о том, что нет экземпляра detailT, и, глядя на код, я не вижу нигде, где создается экземпляр detailT. Мне кажется, что так как detailT является родителем nameT через отношения, вы не можете сохранить nameT без его родителя. Я бы начал здесь.

0 голосов
/ 20 ноября 2010

Просто удалили отношение из класса detailT и добавили его в namesT следующим образом:

details = relationship("detailT", backref='namesT', order_by=id, cascade="all, delete, delete-orphan")

теперь работает!

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