【问题标题】:(psycopg2.DataError) invalid input syntax for integer: importing from csv file?(psycopg2.DataError) 整数输入语法无效:从 csv 文件导入?
【发布时间】:2020-05-25 16:34:20
【问题描述】:

我的 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')

帮助?

【问题讨论】:

    标签: python postgresql sqlalchemy


    【解决方案1】:

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

    next(reader, None)
    

    在你的 for 循环之前。

    【讨论】:

      【解决方案2】:

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

      我的回答提出了一般的设计改进,因为 ISBN 可能不应该是表示是否有标题的数字,请注意,在您检查数据之前,此更改将隐藏该错误。

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

      将 ISBN 类型更改为 varchar(255)

      偏好理由: ISBN 实际上是一个整数吗? IE。你会在它上执行整数运算作为加法吗?或者是一个恰好当前被格式化为数字的 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})
      

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

      【讨论】:

      • 值得注意的是,在这个特定问题中,ISBN 可能已经是一个文本列,因为示例 CSV 包含一个明显的非整数 081299289X,它是 year 列在这里失败了。如果“看不到标题”是指示例数据,则它不存在,但错误消息中的 VALUES 子句放弃了它。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-03-23
      • 2016-05-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多