困在SQLAlchemy和Object-Riation中

2024-03-28 11:14:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我只是在为学习sqlalchemy创建一个简单的地址簿数据库。这是'表格.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)

这是数据库传输.py':

^{pr2}$

每次运行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)

问题出在哪里?在


Tags: nameselfinfoidbasestringsqlalchemydef
2条回答

刚从'detailT'类中删除关系并将其添加到'namesT'中,如下所示:

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

现在起作用了!在

如果我错了,请纠正我,但是错误是说没有detailT实例,并且查看代码,我看不到detailT类实例化的任何地方。在我看来,由于detailT通过关系是nameT的父级,因此没有它的父级就不能保存nameT。我从这里开始。在

相关问题 更多 >