我尝试将csv数据加载到postgres中。创建表部分很好。但是,当我尝试从csv加载数据时,出现了错误。我的代码和错误附在下面。 %s错了吗?
import psycopg2
import csv
conn = psycopg2.connect(host="127.0.0.1", port="5432", database="postgres", user="postgres", password="*******")
print "Opened database successfully"
cur = conn.cursor()
cur.execute('''create table calls_aapl("Ask" float,"Bid" float,"Change" float,"ContractSymbol" varchar(50),"ImpliedVolatility" float,"LastPrice" float,
"LastTradeDate" date,"OpenInterest" int,"PercentChange" float,"Strike" float,"Volume" int);''')
print "Table created successfully"
reader = csv.reader(open('D:/python/Anaconda/AAPL_Data/Calls.csv', 'r'))
for i, row in enumerate(reader):
print(i, row)
if i == 0: continue
cur.execute('''
INSERT INTO "calls_aapl"(
"Ask", "Bid", "Change", "ContractSymbol", "ImpliedVolatility", "LastPrice", "LastTradeDate", "OpenInterest", "PercentChange", "Strike", "Volume"
) values (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)''', row
)
conn.commit()
cur.close()
错误:
(0, ['Ask', 'Bid', 'Change', 'ContractSymbol', 'LastPrice', 'LastTradeDate', 'OpenInterest', 'PercentChange', 'PercentImpliedVolatility', 'Strike', 'Volume'])
(1, ['41.7', '39.75', '1.15', 'AAPL180803C00150000', '41.05', '7/31/2018', '52', '2.88', '154.59', '150', '6'])
DataError: invalid input syntax for type double precision: "7/31/2018"
LINE 4: ...1.7','39.75','1.15','AAPL180803C00150000','41.05','7/31/2018...
^
答案 0 :(得分:0)
可以使用%s
,因为PostgreSQL可以将字符串转换为INSERT
中的数字。
您的问题是另一个问题。您的INSERT
语句指定了列"ImpliedVolatility"
(对于警告混合大小写标识符,为时已晚)不在数据中。
这将导致第五列(标记为LastPrice
插入"ImpliedVolatility"
,而下一列(标记为LastTradeDate
)插入"LastPrice"
。
其中的前一个是错误的,但是可以使用,因为"LastPrice"
和"ImpliedVolatility"
都是float^H^H^H^H^Hdouble precision
,但是后者失败了,因为它试图在{{1}中插入日期字符串}列。
从double precision
语句中省略列"ImpliedVolatility"
。
答案 1 :(得分:0)
我认为这只是拼写错误, 您应该将表列与插入查询相等。 将“ LastTradeDate”插入到“ LastPrice”中,该列不是右列
谢谢
答案 2 :(得分:0)
通常在列标题和值不正确匹配时发生。尝试检查指定的值数量是否相同且数据类型相似。