如何引用Python对象并将其放入MySQL?

时间:2015-12-01 23:39:42

标签: python mysql

我想要实现的是将使用python脚本生成的数据放入MySQL数据库。到目前为止,我已经能够使用Python生成数据并打印它,但我不太确定如何将其放入mysql表中。我已经读过你可以使用MySQLdb作为两者之间的连接器,目前我已经能够将数据放入表中,但只有我手动输入的数据。

希望代码有意义,但我试图将BidSize,AskSize,BidPrice和AskPrice中的值放入表中。

from wrapper_v3 import IBWrapper, IBclient
from swigibpy import Contract as IBcontract

if __name__=="__main__":
"""
This simple example returns streaming price data
"""

callback = IBWrapper()
client=IBclient(callback)

ibcontract = IBcontract()
ibcontract.secType = "FUT"
ibcontract.expiry="201612"
ibcontract.symbol="GE"
ibcontract.exchange="GLOBEX"

ans=client.get_IB_market_data(ibcontract)
print "Bid size, Ask size; Bid price; Ask price"
print ans


import MySQLdb as mdb

con = mdb.connect('localhost', 'testuser', 'test623', 'testdb');

with con:

cur = con.cursor()
cur.execute("DROP TABLE IF EXISTS Histdata")
cur.execute("CREATE TABLE Histdata(Id INT PRIMARY KEY AUTO_INCREMENT, \
             Name VARCHAR(25), BidSize VARCHAR(20), AskSize VARCHAR(20), BidPrice VARCHAR(20), AskPrice VARCHAR(20))")
cur.execute("INSERT INTO Histdata(Name,BidSize,AskSize,BidPrice,AskPrice) VALUES('test','test','test','test','test'))")

2 个答案:

答案 0 :(得分:0)

将查询参数化为:

# assuming ans is a list
bid_size, ask_size, bid_price, ask_price = ans
cur.execute('''
  INSERT INTO Histdata
  (Name,BidSize,AskSize,BidPrice,AskPrice) 
  VALUES(%s,%s,%s,%s,%s)''', ('test', bid_size, ask_size, bid_price, ask_price))

答案 1 :(得分:0)

正如Fabricator正确指出的那样,请参数化您的查询以防止SQL注入。

然而,您没有看到写入表的数据的原因是您没有提交事务。您的光标正在向事务添加查询,但只有在您指示提交后才会将数据实际写入数据库。

在添加游标查询后添加con.commit()以完成事务。

在旧版本的MySQLdb适配器中,Python数据将自动提交。但这被视为"不良做法"因为程序员对交易的控制应该得到尊重。此流程也已在Python的DB API中进行了规定,要求所有数据库适配器都遵守这些流程。

作为旁注:完成后不要忘记关闭光标和连接:

cursor.close()
conn.close()

否则,您的连接将在空闲状态下保持打开状态,您可能会耗尽连接插槽池。