Помощь по транзакциям Python, необходимая для вставки таблицы master-detail - PullRequest
0 голосов
/ 23 ноября 2018

Я пытаюсь реализовать Python Flask rest API.У меня есть две таблицы (master-detail), чтобы вставить значения из проанализированного ответа другого API остальных.

Вот мои таблицы основных данных;

sql_create_purchase_confirmation_response_table = """ CREATE TABLE IF NOT EXISTS purchase_confirmation (
                                        id integer PRIMARY KEY,
                                        responseDatetime DATETIME NOT NULL,
                                        applicationCode text NOT NULL,
                                        version text NOT NULL,
                                        referenceId text NOT NULL,
                                        paymentId text NOT NULL,
                                        productCode text NOT NULL,
                                        quantity integer NOT NULL,
                                        currency text NOT NULL,
                                        unitPrice integer NOT NULL,
                                        totalPrice integer NOT NULL,
                                        merchantProductCode text NOT NULL,
                                        signature text NOT NULL,
                                        purchaseStatusCode text NOT NULL,
                                        purchaseStatusDate DATETIME NOT NULL                                        
                                        ); """

sql_create_purchase_confirmation_detail_response_table = """ CREATE TABLE IF NOT EXISTS purchase_confirmation_detail (
                                            referenceId text NOT NULL,
                                            serials text NULL,
                                            pins text NULL
                                            ); """

А вот мои функции для вставки в таблицы отдельно.

def add_purchase_confirmation_response(database_file, response):
query = "INSERT INTO purchase_confirmation (responseDatetime, applicationCode, version, referenceId," \
        "paymentId, productCode, quantity, currency, unitPrice, totalPrice, merchantProductCode," \
        "purchaseStatusCode, purchaseStatusDate, signature) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"

con = ''
try:

    with sql.connect(database_file, isolation_level=None) as con:
        con.execute('pragma journal_mode=wal')
        cur = con.cursor()
        cur.execute(query, [str(datetime.now()),
                            response['applicationCode'], response['version'], response['referenceId'],
                            response['paymentId'], response['productCode'], response['quantity'],
                            response['currency'], response['unitPrice'], response['totalPrice'],
                            response['merchantProductCode'], response['purchaseStatusCode'],
                            response['purchaseStatusDate'], response['signature']])

        con.commit()

except sql as e:
    con.rollback()
    print e.message
except:
    print("Unexpected error:", sys.exc_info()[0])
    raise

finally:
    con.close()

def add_purchase_confirmation_detail_response(database_file, response):
query = "INSERT INTO purchase_confirmation ( referenceId," \
        "serials, pins) VALUES (?, ?, ?)"

con = ''
try:

    pins = ''
    # parse response coupons
    for item in response['coupons']:
        for itemS in item['serials']:
            serials = itemS

            for itemP in item['pins']:
                pins = pins + itemP + ','

            print serials.rstrip(',')
            print pins.rstrip(',')

            # insert into table here
            with sql.connect(database_file, isolation_level=None) as con:
                con.execute('pragma journal_mode=wal')
                cur = con.cursor()
                cur.execute(query, [response['referenceId'], serials, pins])

                con.commit()
            pins = ''

except sql as e:
    con.rollback()
    print e.message
except:
    print("Unexpected error:", sys.exc_info()[0])
    raise

finally:
    con.close()

** Для предоставления данныхсогласованность, есть ли способ использовать транзакцию?Я новичок в Python, я был бы рад, если вы можете вести меня.**

def confirmation():
try:
    uri = 'https://teststore.com/purchaseconfirmation'
    r = requests.post(uri, data=request_params_confirmation)

    add_purchase_confirmation_response('test.db', r.json())
    add_purchase_confirmation_detail_response('test.db', r.json())
    return jsonify(r.text)
except Exception as e:
    return e.message
except:
    print("Unexpected error:", sys.exc_info()[0])
    raise

1 Ответ

0 голосов
/ 24 ноября 2018

SQLite имеет «атомарные» транзакции, если вы используете BEGIN TRANSACTION.Возможно, в функции confirmation вызовите запрос BEGIN TRANSACTION перед вызовами add_purchase ... и затем выполните commit или rollback в зависимости от успеха или неудачи.Вы также можете найти этот документ на занятый тайм-аут заметный.

...