sqlalchemy - как сохранить несколько кортежей одновременно в БД, а затем зафиксировать - PullRequest
0 голосов
/ 26 июня 2018

У меня есть этот класс

class Order(db.Model):
__tablename__ = "orders"

id=db.Column(db.String, primary_key=True)
order_id = db.Column(db.String, nullable=True)
product_id=db.Column(db.String, nullable=True)
quantity=db.Column(db.Integer, nullable=True)


def save_to_db(self):

    db.session.add_all(self)
    db.session.commit()

И у меня есть этот класс

class checkout(Resource):
# @jwt_required
def post(self):
    # current_user = get_jwt_identity()

    # user_wallet=Wallet.find_by_customer_id(current_user)
    order_id=uuid.uuid1()

    data = parser_checkout.parse_args()
    print (data['Products'][0]['Product_id'])
    mainlist=list()
    for i in range(0,len(data['Products'])):
        new_order_prod=Order(
            id=uuid.uuid1(),
            order_id=order_id,
            product_id=data['Products'][i]['Product_id'],
            quantity=data['Products'][i]['quantity']


        )

        mainlist.append(new_order_prod)
    try:

        mainlist.save_to_db()
        return {
            'status':'succes',
            'message':'sucess order placed'
        },200
    except:
        return {
            'status':'error',
            'message':'order placing failed'
        },401

Я не получаю никакой ошибки, но обнаружил, что mainlist.save_to_db() не работает, я имею в виду, что он не входит в функцию этого класса. Может кто-нибудь мне помочь ? Я думаю, что не входя в эту функцию, объект класса becoz является кортежем с соответствующими полями, но я делаю список и вызываю его, поэтому так ли это, что он не работает? Любое решение этого?

1 Ответ

0 голосов
/ 26 июня 2018

Вы звоните mainlist.save_to_db(), но объявляете mainlist = list(), поэтому у него не будет метода save_to_db.Кроме того, у вас есть except, поэтому любые ошибки, возникающие при этом, будут подавлены.Лучше обрабатывать только определенные исключения или, по крайней мере, записывать, что это за исключения, если вы выполняете всеохватывающее except.

Вместо того, чтобы помещать метод save_to_db в класс Order, что означает, что вызов этого параметра влияет только на 1 экземпляр, вместо этого вызовите db.session.add_all(mainlist) и db.session.commit().

...