While all the checks work, (empty symbol, invalid number of shares…), the function fails to actually purchase the stocks. It returns an internal server error. Following is the log output:
File “/usr/local/lib/python3.9/site-packages/cs50/sql.py”, line 71, in _execute raise RuntimeError(exc.orig) from None RuntimeError: incomplete input
Following is my buy function:
def buy(): """Buy shares of stock""" if request.method == "POST": # access symbol and stock symbol = request.form.get("symbol") stock = lookup(symbol) # ensure valid symbol if not symbol: return apology("Please enter a valid symbol") elif not stock: #if symbol is invalid then none will get allocated to stock, which we dont want return apology("Invalid symbol") # access the number of shares and check for an integer try: shares = int(request.form.get("shares")) except: return apology("Shares must be an integer") # if shares are negative if shares <= 0: return apology("Shares must be a positive integer") user_id = session["user_id"] cash = db.execute("SELECT cash FROM users WHERE id = ?", user_id)[0]["cash"] stock_name = stock["name"] stock_price = stock["price"] total_price = stock_price * shares # check for sufficient funds if total_price > cash: return apology("Insufficient funds.") else: db.execute("UPDATE users SET cash = ? WHERE id = ?", cash - total_price, user_id) db.execute("INSERT INTO transactions (user_id, name, shares, price, type, symbol) VALUES ( ?, ?, ?, ?, ?, ?", user_id, stock_name, shares, stock_price, 'buy', symbol) flash("Bought!") return redirect('/') else: return render_template("buy.html")
Following is my HTML code:
{% extends "layout.html" %} {% block title %} buy {% endblock %} {% block main %} <form action="/buy" method="post"> <div class="form-group"> <input autocomplete="off" autofocus class="form-control" name="symbol" placeholder="symbol" type="text"> </div> <div class="form-group"> <input class="form-control" name="shares" placeholder="shares" type="text"> </div> <button class="btn btn-primary" type="submit">Buy</button> </form> {% endblock %}
Following is my SQL table:
field | type |
---|---|
id | INTEGER PRIMARY KEY AUTOINCREMENT, |
user_id | INTEGER NOT NULL, |
name | TEXT NOT NULL, |
shares | INTEGER NOT NULL, |
price | NUMERIC NOT NULL, |
type | TEXT NOT NULL, |
symbol | TEXT NOT NULL, |
time | TIMESTAMP DEFAULT CURRENT_TIMESTAMP |
FOREIGN KEY(user_id) REFERENCES users(id) |
Advertisement
Answer
db.execute("INSERT INTO transactions (user_id, name, shares, price, type, symbol) VALUES ( ?, ?, ?, ?, ?, ?", user_id, stock_name, shares, stock_price, 'buy', symbol)
Could it be that this statement needs to have a closing round bracket in VALUES?
db.execute("INSERT INTO transactions (user_id, name, shares, price, type, symbol) VALUES ( ?, ?, ?, ?, ?, ?);", user_id, stock_name, shares, stock_price, 'buy', symbol)