Flask sqlalchemy 对象不在会话中

问题描述 投票:0回答:1

在处理数据库时,我遇到了以下无法解决的错误:

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>,)]

任何帮助将不胜感激:)

database flask sqlalchemy flask-sqlalchemy
1个回答
0
投票

您正在尝试将

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)。

© www.soinside.com 2019 - 2024. All rights reserved.