簡體   English   中英

sqlalchemy.exc.IntegrityError: (sqlite3.IntegrityError) UNIQUE constraint failed: book.isbn 在解析和插入 csv 數據到數據庫時

[英]sqlalchemy.exc.IntegrityError: (sqlite3.IntegrityError) UNIQUE constraint failed: book.isbn when parsing and inserting csv data into database

我對整個 flask/sqlalchemy 框架還很陌生,所以我想尋求一些幫助來弄清楚我的 flask 應用程序出了什么問題。 據我所知,我已經完成了主要的關鍵關系,因為它們應該是一對多的,從書到評論。 請提前感謝任何形式的幫助。 我在下面插入了我的代碼以供進一步參考。

主程序

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!')

模型.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
    }

當您嘗試插入具有來自具有UNIQUE屬性的列的值的行與具有相同值的現有數據沖突時,插入表時會發生唯一約束失敗。 要解決此問題,如果要插入空表,則可以編輯 CSV 文件並使用find或其他選項來定位重復值。 如果該表有現有數據,我建議創建一個臨時表而不為所述列定義 PK/UNIQUE。 然后填充來自兩個來源的數據。 接下來,運行這樣的語句來查找重復值:

select problematic_column, count(problematic_column) ct from temporary_table 
group by problematic_column having ct>1 ;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM