我正在开发基于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。将数据插入两个表。我想插入如下数据:
我认为不仅数据插入过程存在问题,而且表格创建也存在问题。
这是错误,tbh,没有告诉我任何事情:
sqlalchemy.exc.ArgumentError: relationship 'category' expects a class or a mapper argument (received: <class 'sqlalchemy.sql.schema.Table'>)
答案 0 :(得分:0)
你有两个错误:
"category"
写为Mapper类而不是"CategoryTable"
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
,更好的名称)