sqlalchemy.exc.IntegrityError: (sqlite3.IntegrityError) UNIQUE constraint failed: book.isbn when parsing and inserting csv data into database
sqlalchemy.exc.IntegrityError: (sqlite3.IntegrityError) UNIQUE constraint failed: book.isbn when parsing and inserting csv data into database
我对整个 flask/sqlalchemy 框架还很陌生,所以我想寻求一些帮助来找出我的烧瓶应用程序有什么问题。据我所知,我已经完成了主要的关键关系,因为它们应该是一对多的,从书到评论。请提供任何形式的帮助,在此先感谢!我在下面插入了我的代码以供进一步参考。
main.py
with open('books.csv', newline='') as csvfile:
reader = csv.DictReader(csvfile)
for row in reader:
book = Book(isbn=row['ISBN'],title=row['Book-Title'], author=row['Book-Author'],
publication_year=row['Year-Of-Publication'], publisher=row['Publisher'])
db.session.add(book)
db.session.commit()
print('database initialized!')
models.py
class Review(db.Model):
id = db.Column(db.Integer, primary_key=True)
text=db.Column(db.String)
rating=db.Column(db.Integer)
book=db.Column(db.String,db.ForeignKey("book.isbn"))
def toDict(self):
return {
"id": self.id,
"text": self.text,
"rating": self.rating,
"isbn": self.isbn
}
class Book(db.Model):
isbn=db.Column(db.String, primary_key=True)
title=db.Column(db.String)
author=db.Column(db.String)
publication_year=db.Column(db.String)
publisher=db.Column(db.String)
reviews = db.relationship('Review', backref='book_review',lazy=True, cascade="all, delete-orphan")
def toDict(self):
return {
"isbn": self.isbn,
"title": self.title,
"author": self.author,
"publication_year": self.publication_year,
"reviews": self.reviews
}
插入 table 时唯一约束失败发生在您尝试插入的行的值来自具有 UNIQUE
属性的列与具有相同值的现有数据冲突时。要解决此问题,如果要插入空 table,您可以编辑 CSV 文件并使用 find
或其他选项来定位重复值。如果 table 有现有数据,我建议创建一个临时的 table 而无需为所述列定义 PK/UNIQUE。然后填充来自两个来源的数据。接下来,运行 像这样的语句来查找重复值:
select problematic_column, count(problematic_column) ct from temporary_table
group by problematic_column having ct>1 ;
我对整个 flask/sqlalchemy 框架还很陌生,所以我想寻求一些帮助来找出我的烧瓶应用程序有什么问题。据我所知,我已经完成了主要的关键关系,因为它们应该是一对多的,从书到评论。请提供任何形式的帮助,在此先感谢!我在下面插入了我的代码以供进一步参考。
main.py
with open('books.csv', newline='') as csvfile:
reader = csv.DictReader(csvfile)
for row in reader:
book = Book(isbn=row['ISBN'],title=row['Book-Title'], author=row['Book-Author'],
publication_year=row['Year-Of-Publication'], publisher=row['Publisher'])
db.session.add(book)
db.session.commit()
print('database initialized!')
models.py
class Review(db.Model):
id = db.Column(db.Integer, primary_key=True)
text=db.Column(db.String)
rating=db.Column(db.Integer)
book=db.Column(db.String,db.ForeignKey("book.isbn"))
def toDict(self):
return {
"id": self.id,
"text": self.text,
"rating": self.rating,
"isbn": self.isbn
}
class Book(db.Model):
isbn=db.Column(db.String, primary_key=True)
title=db.Column(db.String)
author=db.Column(db.String)
publication_year=db.Column(db.String)
publisher=db.Column(db.String)
reviews = db.relationship('Review', backref='book_review',lazy=True, cascade="all, delete-orphan")
def toDict(self):
return {
"isbn": self.isbn,
"title": self.title,
"author": self.author,
"publication_year": self.publication_year,
"reviews": self.reviews
}
插入 table 时唯一约束失败发生在您尝试插入的行的值来自具有 UNIQUE
属性的列与具有相同值的现有数据冲突时。要解决此问题,如果要插入空 table,您可以编辑 CSV 文件并使用 find
或其他选项来定位重复值。如果 table 有现有数据,我建议创建一个临时的 table 而无需为所述列定义 PK/UNIQUE。然后填充来自两个来源的数据。接下来,运行 像这样的语句来查找重复值:
select problematic_column, count(problematic_column) ct from temporary_table
group by problematic_column having ct>1 ;