我想要实现的是将使用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'))")
答案 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()
否则,您的连接将在空闲状态下保持打开状态,您可能会耗尽连接插槽池。