Я прошу прощения за публикацию такого большого количества кода, я не смог повторить поведение в обобщенной упрощенной программе, поэтому мне пришлось опубликовать реальный код.
Цель - содержимое cart
таблица для размещения в таблицах orders
и odetails
.
На самом деле происходит следующее: если в корзине есть одна запись, в таблицах заказов будет более десяти записей.Я вижу, что циклы for, которые выполняются после insertSql
, состоят в том, что он будет проходить через весь цикл один раз и завершаться в разрыве.То есть он выполняет insertSql
, затем извлекает номер заказа ono
, затем устанавливает атрибут класса orderNumber
для полученного номера заказа ono
и устанавливает корзину пустой.Чего мне не хватает?
Я использую Python 2.7
и модули cmd
и cx_Oracle
.
def oneClick(self,userLoggedIn):
#this checks if there is a credit card available, if there isn't it denies one click check out
sql = """
SELECT creditcardnumber, creditcardtype
FROM bs_members
WHERE userid = :userid
"""
ds.execute(sql,userid=userLoggedIn)
for row in ds:
if row == (None,None):
print """
One click check out is not available if you do not have a credit card on file.
"""
else:
break
#this checks to see if the user has anything in the cart
cartSql = """
SELECT DISTINCT userid FROM bs_cart WHERE userid = :userid
"""
ds.execute(cartSql,userid=userLoggedIn)
#this places the contents of the cart into the order tables
insertSql = """
BEGIN
INSERT INTO bs_orders (userid, ono, timePurchased)
VALUES (:userid, orderNum_seq.NEXTVAL,(SELECT current_timestamp FROM dual));
COMMIT;
UPDATE bs_orders
SET shipaddress = (SELECT address FROM bs_members WHERE userid = :userid)
, shipcity = (SELECT city FROM bs_members WHERE userid = :userid)
, shipstate = (SELECT state FROM bs_members WHERE userid = :userid)
, shipzip = (SELECT zip FROM bs_members WHERE userid = :userid)
WHERE userid = :userid
AND timePurchased IN
(
SELECT MAX(timePurchased)
FROM bs_orders
WHERE userid = :userid
GROUP BY userid
);
INSERT INTO bs_odetails (ono, isbn, qty, price)
SELECT orderNum_seq.CURRVAL, bs_cart.isbn, bs_cart.qty, bs_books.price
FROM bs_orders, bs_cart, bs_books
WHERE bs_orders.userid = :userid
AND bs_cart.userid = :userid
AND bs_books.isbn = bs_cart.isbn;
DELETE FROM bs_cart
WHERE userid = :userid;
END;
"""
#if the cart has contents this for loop is executed
for row in ds:
ds.execute(insertSql,userid=userLoggedIn)
sql = """
SELECT ono
FROM bs_orders
WHERE userid = :userid
AND timePurchased IN
(
SELECT MAX(timePurchased)
FROM bs_orders
WHERE userid = :userid
GROUP BY userid
)
"""
ds.execute(sql,userid=userLoggedIn)
for row in ds:
self.orderNumber = ''.join(str(i) for i in row)
self.cartIsEmpty = False
break
#if the cart does not have any contents the user is told to try again
else:
print """
You have nothing in your cart!
"""
self.cartIsEmpty = True