如何解决双精度类型的无效输入语法

时间:2018-08-01 06:46:56

标签: python postgresql

我尝试将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...
                                                             ^

3 个答案:

答案 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)

通常在列标题和值不正确匹配时发生。尝试检查指定的值数量是否相同且数据类型相似。