AttributeError:'unicode'对象没有属性'_sa_instance_state'

Jon*_*Ong 9 python sqlalchemy

我只是学习如何使用SQLAlchemy.我正在尝试执行以下操作,但将标题和链接存储在两个单独的表中:

temp = Submissions(title=u'Facebook Homepage', link=u'http://facebook.com')
session.add(temp)
session.flush()
transaction.commit()
Run Code Online (Sandbox Code Playgroud)

通过:

class Links(Base):
    __tablename__ = 'links'
    id = Column(Integer, primary_key=True)
    link = Column(Text)
    created = Column(TIMESTAMP(), default=datetime.now())

    def __init__(self, link):
        self.link = link

class Submissions(Base):
    __tablename__ = 'submissions'
    id = Column(Integer, primary_key=True)
    created = Column(TIMESTAMP(), default=datetime.now())
    title = Column(Text)
    link_id = Column(Integer, ForeignKey('links.id'))
    link = relation(Links)

    def __init__(self, title, link):  
        self.title = title
        self.link = link
Run Code Online (Sandbox Code Playgroud)

但是,我总是得到这个错误:

AttributeError: 'unicode' object has no attribute '_sa_instance_state'
Run Code Online (Sandbox Code Playgroud)

到底是怎么回事?有没有更好的方法来编码?

Sin*_*ion 8

你不能那样做relationship.

你需要安排以Link某种方式查找.

最明显的是直接查找.

submission_link = session.query(Links) \
                         .filter(Links.link == u'http://facebook.com') \
                         .first()
if submission_link is None:
    submission_link = Links(link=u'http://facebook.com')
    session.add(submission_link)

submission = Submissions(title=u'Facebook Homepage', link=submission_link)
session.add(submission)
session.commit()
Run Code Online (Sandbox Code Playgroud)

你也可以使用混合属性来获得看起来更像你的例子的东西,但它更复杂.

此外,它是relationship,relation已被弃用.