(psycopg2.DataError)整数的无效输入语法:从csv文件导入?

时间:2018-09-21 14:54:15

标签: python postgresql sqlalchemy

我的csv文件中的数据如下:

081299289X,China Dolls,Lisa See,2014
0345498127,Starter for Ten,David Nicholls,2003
0061053716,Imajica,Clive Barker,1991
0553262149,Emily Climbs,L.M. Montgomery,1925

我的import.py像这样:

import csv
import os

from sqlalchemy import create_engine
from sqlalchemy.orm import scoped_session, sessionmaker

engine = create_engine('postgres://pnrvnavoxvnlgw:....')
db = scoped_session(sessionmaker(bind=engine))

def main():
    f = open("books.csv")
    reader = csv.reader(f)
    for isbn, title, author, year in reader:
        db.execute(
            "INSERT INTO books (isbn, title, author, publication_year)
               VALUES (:isbn, :title, :author, :publication_year)",
            {"isbn": isbn, "title": title, "author": author, "publication_year": year}
        )
    db.commit()

if __name__ == "__main__":
    main()

由于某种原因,我似乎看不到这段代码有什么问题。这是错误:

sqlalchemy.exc.DataError: (psycopg2.DataError) invalid input syntax for integer: "year"
LINE 1: ...publication_year) VALUES ('isbn', 'title', 'author', 'year')

帮助?

2 个答案:

答案 0 :(得分:3)

从外观上看,您的CSV包含标题作为第一行。例如跳过

next(reader, None)

在循环之前。

答案 1 :(得分:0)

回答类似问题。我无法从IljaEverilä的答案中看到标题,但当然,如果有标题,Everilä是完全正确的,则需要跳过它(或将其制成地图)。

我的答案提出了总体设计改进,因为ISBN可能不应该是表示有标头的数字,所以请注意,此更改将隐藏该错误,直到您检查数据为止。

更改数据库架构(可能是首选)

将ISBN类型更改为varchar(255)

理由偏好: ISBN实际上是整数吗?即您会对其执行整数运算吗?还是当前刚好将ID格式化为数字的ID?另外,ISBN是您无法控制的ID格式。您是否真的希望您的应用程序与当前格式紧密结合?如果将来ISBN更改为包含字母,会发生什么?

或者,转换字符串

或者,您可以只转换isbn

isbnAsNumber = int(isbn.strip().replace("-", ""))
db.execute("INSERT INTO books (isbn, title, author, year) VALUES (:isbn, :title, :author, :year)",
            {"isbn": isbnAsNumber, "title": title, "author": author, "year": year})

但是,与第一个解决方案中建议的更改逻辑类型相比,我认为这是一个肮脏的解决方案。