SQLAlchemy将数据插入两个表中

时间:2017-12-03 14:49:40

标签: python sqlalchemy

我正在开发基于SQLAlchemy的第一个应用程序,经过几个小时的工作与文档和一些视频,我仍然无法解决问题。

我的应用程序是一个简单的CRUD杂货清单。我想将产品的类别保存在单独的表中,所以这里是SQLAlchemy的关系模块。错误消息没有给我任何暗示。

engine = create_engine(my_database, echo = True)

connection = engine.connect()

Base = declarative_base()
session = sessionmaker(bind=engine)

class MyEnum(enum.Enum):
    one = "pieces"
    two = "kg"

class ProductTable(Base):
    __tablename__ = 'product'
    product_id = Column(Integer, primary_key=True)
    product_name = Column(String(30), nullable=False)
    product_quantity = Column(Integer, nullable=False)
    product_type = Column(Enum(MyEnum), nullable=False)
    category_id = Column(Integer, ForeignKey('category.id'), nullable=False)
    category = relationship("category", back_populates="product")
    product_description = Column(String(255))


class CategoryTable(Base):
    __tablename__ = 'category'
    id = Column(Integer, primary_key=True)
    category_name = Column(String(25), nullable=False)

Base.metadata.create_all(engine)

session = session()

cc_product = ProductTable(product_id=1,
                          product_name="cucumber",
                          product_quantity="1",
                          product_type="kg",
                          product_description="For the salad")

cc_category= CategoryTable(category_name="vegetables")


session.add(cc_product, cc_category)

session.commit()

予。表格的创建顺利完成而没有错误,但创作本身设计得恰当吗?每个产品都有单一类别,但应将一个类别分配给一个或多个产品。我是基于一对一的关系做到的。

II。将数据插入两个表。我想插入如下数据:

  1. Product_id = 1
  2. Product_name = Cucumber
  3. Product_quantity = 1
  4. Product_type =" kg"或"件"
  5. 类别=蔬菜(来自类别表)
  6. 描述=" blah blah blah"
  7. 我认为不仅数据插入过程存在问题,而且表格创建也存在问题。

    这是错误,tbh,没有告诉我任何事情:

    sqlalchemy.exc.ArgumentError: relationship 'category' expects a class or a mapper argument (received: <class 'sqlalchemy.sql.schema.Table'>)
    

1 个答案:

答案 0 :(得分:0)

你有两个错误:

  1. 您将"category"写为Mapper类而不是"CategoryTable"
  2. 忘了在'CategoryTable'上创建产品
  3. class ProductTable(Base):
        __tablename__ = 'product'
        product_id = Column(Integer, primary_key=True)
        product_name = Column(String(30), nullable=False)
        product_quantity = Column(Integer, nullable=False)
        product_type = Column(Enum(MyEnum), nullable=False)
        category_id = Column(Integer, ForeignKey('category.id'), nullable=False)
        categories = relationship("CategoryTable", back_populates="products")
        product_description = Column(String(255))
    
    
    class CategoryTable(Base):
        __tablename__ = 'category'
        id = Column(Integer, primary_key=True)
        category_name = Column(String(25), nullable=False)
        products = relationship('ProductTable', back_populates='categories')
    

    仍然需要进行一些更改:

    • CategoryTable更改为Category(也适用于ProductTable,更好的名称)
    • 在你开始运行之后,你的约束会失败......