【问题标题】:Sqlalchemy Many to Many not adding data into DBSqlalchemy 多对多不将数据添加到数据库中
【发布时间】:2017-07-09 13:55:31
【问题描述】:

我的数据库中有一个多对多的关系。问题是提交表单时没有填充多对多表。

这是我的模型代码:

CompanyCategory = Table('CompanyCategory', Base.metadata,
    Column('id', Integer, primary_key=True),
    Column('categoryId', Integer, ForeignKey('categories.id')),
    Column('companyId', Integer, ForeignKey('companies.id')))

class Company(Base):
    __tablename__ = 'companies'
    id = Column(Integer, primary_key=True)
    company_name = Column(Text, nullable=False)
    users_id = Column(Integer, ForeignKey('users.id'))
    users = relationship("User", backref=backref('users', cascade="all, delete-orphan"),
                           lazy='joined')

    # foreign key for category
    addresses_category = relationship('Category', secondary=CompanyCategory, backref='companies')

    def __init__(self, company_name=None, users_id=None):
        self.company_name = company_name        
        self.users_id = users_id

    def get(self, id):
        if self.id == id:
            return self
        else:
            return None    

    def __repr__(self):
        return '<%s(%r, %r, %r)>' % (self.__class__.__name__, self.id, self.company_name, self.users_id)

class Category(Base):
    __tablename__ = 'categories'
    id = Column(Integer, primary_key=True)
    category_name = Column(Text, nullable=False)
    addresses_company = relationship('Company', secondary=CompanyCategory, backref='categories')

    def __init__(self, category_name=None):
        self.category_name = category_name

    def get(self, id):
        if self.id == id:
            return self
        else:
            return None    

    def __repr__(self):
        return '<%s(%r, %r)>' % (self.__class__.__name__, self.id, self.category_name)

我有两个课程CompanyCategory。一家公司可以有多个类别(稍后我将创建固定数量的类别)。

为了展示这一点,我创建了一个简单的多对多关系 CompanyCategory

据我了解,如果创建了公司和类别的外键,sqlalchemy 应该会自动添加这些外键。

这就是我在数据库中添加公司和类别的部分:

new_user_company = Company(company_name=form.company_name.data.strip(), users_id = new_user.id)

if new_user_company: 
    db_session.add(new_user_company)

    db_session.commit()                   

    new_user_company_category = Category(category_name=form.category_name.data)

    if new_user_company_category:

        db_session.add(new_user_company_category)

        db_session.commit()

在这种情况下,数据将添加到 Company 和 Category,但 CompanyCategory 没有条目。

我已经在这里尝试了一些解决方案,但它们主要用于flask-sqlalchemy,而不是用于双向行为。我需要双向行为,因为如果删除公司,则该公司发生的所有多对多关系也应该被删除。此外,如果某个类别将被删除(可能不会发生),则应删除与出现这些类别的公司的所有关系。

谢谢

【问题讨论】:

    标签: python flask sqlalchemy many-to-many


    【解决方案1】:

    正如SQLAlchemy ORM tutorial 解释的那样:您需要为实例指定relationship 属性。在您的情况下,您需要设置Company.addresses_categoryCategory.addresses_company

    new_user_company = Company(company_name=form.company_name.data.strip(), users_id = new_user.id)
    
    if new_user_company: 
        db_session.add(new_user_company)
    
        db_session.commit()                   
    
        new_user_company_category = Category(category_name=form.category_name.data)
    
        new_user_company_category.addresses_company.append(new_user_company)
    
        if new_user_company_category:
    
            db_session.add(new_user_company_category)
    
            db_session.commit()
    

    另外,如果您需要删除父对象之一的关系,最好设置ondelete属性:

    CompanyCategory = Table('CompanyCategory', Base.metadata,
        Column('id', Integer, primary_key=True),
        Column('categoryId', Integer, ForeignKey('categories.id', ondelete='CASCADE')),
        Column('companyId', Integer, ForeignKey('companies.id', ondelete='CASCADE')))
    

    【讨论】:

      猜你喜欢
      • 2020-03-11
      • 1970-01-01
      • 2020-09-22
      • 2020-10-16
      • 1970-01-01
      • 1970-01-01
      • 2017-04-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多