我的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')
帮助?
答案 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})
但是,与第一个解决方案中建议的更改逻辑类型相比,我认为这是一个肮脏的解决方案。