在处理数据库时,我遇到了以下无法解决的错误:
SAWarning: Object of type <Order> not in session, add operation along 'Customer.customer_ID2' won't proceed
(This warning originated from the Session 'autoflush' process, which was invoked automatically in response to a user-initiated operation.)
order2 = Order(customerID=customer2, PaymentID=payment2.id)
下面是相关代码,对于任何愚蠢的错误,我真诚地表示歉意,我已经研究了代码很长时间才能使其正常工作。
def database():
def database():
app = Flask(__name__, static_folder='../client', static_url_path='/')
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///database.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
class Payment(db.Model):
id = db.Column(db.Integer, primary_key=True)
paymentDate = db.Column(db.DateTime, nullable=False)
paymentAmount = db.Column(db.Float, nullable=False)
customerID = db.relationship('Customer', backref='customer_ID1', lazy=True, uselist=False)
orderID = db.relationship('Order', backref='order_id', lazy=True, uselist=False)
class ShoppingCart(db.Model):
id = db.Column(db.Integer, primary_key=True)
cartItems = db.relationship('CartItem', backref='cartItemID', lazy=True, uselist=True)
customerID = db.Column(db.Integer, db.ForeignKey('customer.id'), nullable=False)
class Customer(db.Model): #what if we are not logged in and place an order
id = db.Column(db.Integer, primary_key=True)
password = db.Column(db.String, nullable=False)
email = db.Column(db.String, nullable=False)
firstName = db.Column(db.String, nullable=False)
lastName = db.Column(db.String, nullable=False)
ShoppingCartID = db.relationship('ShoppingCart', backref='shopping_cart', lazy=True, uselist=False)
paymentID = db.Column(db.Integer, db.ForeignKey('payment.id'), nullable=True)
orderID = db.Column(db.Integer, db.ForeignKey('order.id'), nullable=True)
def set_password(self, password):
self.password = generate_password_hash(password).decode('utf8')
class CartItem(db.Model):
id = db.Column(db.Integer, primary_key=True)
quantity = db.Column(db.Integer, nullable=False) #q per patch
productID = db.relationship('Product', backref='cart_item', lazy=True, uselist=False)
SCID = db.Column(db.Integer, db.ForeignKey('shopping_cart.id'), nullable=False)
class Product(db.Model):
id = db.Column(db.Integer, primary_key=True)
price = db.Column(db.Float, nullable=False)
amountLeft = db.Column(db.Integer, nullable=False)
name = db.Column(db.String, nullable=False)
description = db.Column(db.String, nullable=True)
#img = db.Column(db.LargeBinary, nullable=False) eget image library (imgID)
subcategory = db.relationship('Subcategory', backref='product_ID', lazy=True, uselist=True)
CartItemID = db.Column(db.Integer, db.ForeignKey('cart_item.id'), nullable=True)
class Order(db.Model):
id = db.Column(db.Integer, primary_key=True)
customerID = db.relationship('Customer', backref='customer_ID2', lazy=True, uselist=False)
PaymentID = db.Column(db.Integer, db.ForeignKey('payment.id'), nullable=False)
class Subcategory(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String, nullable=False)
category = db.relationship('Category', backref='subcategory_id', lazy=True, uselist=True)
productID = db.Column(db.Integer, db.ForeignKey('product.id'), nullable=True) #nullable???
class Category(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String, nullable=False)
subcategoryID = db.Column(db.Integer, db.ForeignKey('subcategory.id'), nullable=True)
数据库正在使用以下代码填充:
with app.app_context():
db.create_all()
db.session.commit()
.
.
.
# Create sample orders
order1 = Order(customerID=customer1, PaymentID=payment1.id)
order2 = Order(customerID=customer2, PaymentID=payment2.id)
# Add orders to the session
db.session.add_all([order1, order2])
# Commit the session
db.session.commit()
对我来说,数据库似乎没问题,并写道:
order1 = Order(customerID=customer1, PaymentID=payment1)
order2 = Order(customerID=customer2, PaymentID=payment2)
反而给了我以下错误
sqlalchemy.exc.ProgrammingError: (sqlite3.ProgrammingError) Error binding parameter 1: type 'Payment' is not supported
[SQL: INSERT INTO "order" ("PaymentID") VALUES (?) RETURNING id]
[parameters: (<Payment 11>,)]
任何帮助将不胜感激:)
您正在尝试将
Payment
类型的“对象”分配给需要 int
的对象。
我们可以从错误中看到“对象”是一个只有一个元素的元组,是一个
Payment
对象。
我猜这来自于之前使用 SQLA 所做的
select
语句。
如果你想直接在模型上分配一个对象,你可以声明一个
relationship
:
class Order(db.Model):
id = db.Column(db.Integer, primary_key=True)
customerID = ...
PaymentID = ...
payment = relationship("Payment", back_populates="OrderID")
我相信混乱来自于命名:“SomethingID”有时是一种关系,有时是一个列。我建议在关系中删除“ID”后缀并尝试保持连贯的大小写(snake_case)。