spider22
spider22

Reputation: 119

Using complex mysql query python is not returning correct values

I am trying to get results from mysql database using python3 and having some issues retrieving the values.

MySQL table:

Stock       Date          Price
GOOG        2012-05-20    402
GOOG        2012-05-21    432
APPL        2012-05-20    553
APPL        2012-05-21    590
FB          2012-05-20     40
FB          2012-05-21     34

Following is the expected result in MySQL

Stock       Date          Price Change
GOOG        2012-05-21    30
APPL        2012-05-21    37
FB          2012-05-21    -6

I am using following MySQL to get results mentioned in expected results above:

SELECT t1.stock, 
    t1.date                      AS CurrentDate, 
    oldDate.date                 AS OldDate, 
    ( t1.price - oldDate.price ) AS PriceChange 
FROM   mp_stocktable t1 
    JOIN (SELECT t2.stock, 
                    t2.date              AS date1, 
                    (SELECT Max(t3.date) 
                    FROM   mp_stocktable t3 
                    WHERE  t3.date < t2.date 
                            AND t3.stock = t2.stock 
                    GROUP  BY t3.stock) AS date2 
            FROM   mp_stocktable t2) AS StockDates 
        ON StockDates.stock = t1.stock 
            AND StockDates.date1 = t1.date 
    JOIN mp_stocktable oldDate 
        ON oldDate.stock = t1.stock 
            AND oldDate.date = StockDates.date2     

I have following python function which is running query mentioned above with where clause

def checkStockSold(db,stock):
    print("*************checkStockSold*************")
    try:
        curs = db.cursor()
        query = ("
            SELECT t1.stock, 
        t1.date                      AS CurrentDate, 
        oldDate.date                 AS OldDate, 
        ( t1.price - oldDate.price ) AS PriceChange 
    FROM   mp_stocktable t1 
        JOIN (SELECT t2.stock, 
                        t2.date              AS date1, 
                        (SELECT Max(t3.date) 
                        FROM   mp_stocktable t3 
                        WHERE  t3.date < t2.date 
                                AND t3.stock = t2.stock 
                        GROUP  BY t3.stock) AS date2 
                FROM   mp_stocktable t2) AS StockDates 
            ON StockDates.stock = t1.stock 
                AND StockDates.date1 = t1.date 
        JOIN mp_stocktable oldDate 
            ON oldDate.stock = t1.stock 
                AND oldDate.date = StockDates.date2"
                "WHERE t1.stock = %s",(Stock,))
        print(query)                
        curs.execute(query)
        for calcStockBalance in curs:
            pprint.pprint(calcStockBalance)
            return calcStockBalance
    except TypeError as e:
            print(e)   

I am getting following when I do pprint or print on calcStockBalance

a bytes-like object is required, not 'tuple'

What I am doing wrong here ?

I have also tried the for loop like this

for stock, currentdate, olddate, calcStockBalance in curs:
    pprint.pprint(stock, currentdate, olddate, calcStockBalance)
    return stock, currentdate, olddate, calcStockBalance

I get same Error

Any guidance will be appreciated. I am stuck at this point.

Upvotes: 1

Views: 100

Answers (1)

MegaIng
MegaIng

Reputation: 7886

You only have a small typo.

Change this line:

"WHERE t1.stock = %s",(Stock,))

To this line:

"WHERE t1.stock = %s"%(Stock,))

Then it should work.

Upvotes: 1

Related Questions