我有一個帶有謎題和類別的多對多關系資料庫。當我第一次運行它時,一切都非常好。所有表格都被創建并填充了內容。但是,當我第二次運行它以進一步填充資料庫時,會彈出以下錯誤。
AttributeError: Could not locate column in row for column '_sa_instance_state'
我已經將問題縮小到知道在資料庫中已經找到相同類別時它會崩潰。但是不能將其分配給新拼圖的類別,因為那是崩潰發生的地方。
我制作了以下可重現的示例。運行一次,它運行完美,再次運行它,它會崩潰。
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///example.db'
db = SQLAlchemy(app)
category_identifier = db.Table('category_identifier',
db.Column('categories_id', db.Integer, db.ForeignKey('categories.id')),
db.Column('puzzles_id', db.Integer, db.ForeignKey('puzzles.id'))
)
class Puzzle(db.Model):
__tablename__ = 'puzzles'
id = db.Column(db.Integer, primary_key=True)
categories = db.relationship("Category", secondary=category_identifier)
class Category(db.Model):
__tablename__ = 'categories'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(80), unique=True, nullable=False)
db.create_all()
db.session.commit()
if __name__ == '__main__':
myList = ['cat1', 'cat2, cat3']
puzzle = Puzzle()
for cat in myList:
category = db.session.query(Category.name).filter_by(name=cat).first()
if not category:
category = Category(name=cat)
puzzle.categories.append(category)
db.session.add(puzzle)
db.session.commit()
編輯
我發現兩種情況下變數的型別都不同,我認為這可能是它失敗的原因。第一次,變數的型別是<class 'models.Category'>,第二次,當它崩潰時,它是 instance <class 'sqlalchemy.engine.row.Row'>。
有沒有辦法將變數型別轉換為類 models.category 并看看這是否可能是一個解決方案?
uj5u.com熱心網友回復:
錯誤資訊
AttributeError: 無法在“_sa_instance_state”列的行中找到列
乍一看相當晦澀。這意味著我們正在嘗試執行某些特定于模型實體的操作,但是正在執行操作的物件不是模型實體。
在這種特殊情況下,在執行
session.add(puzzle)
我們似乎Puzzle在會話中添加了一個,但是結果
db.session.query(Category.name).filter(name=cat).first()
將是一行(比如('cat1',),因為我們正在檢索一個屬性,而不是一個模型實體。
將查詢替換為
db.session.query(Category).filter(name=cat).first()
將檢索模型實體并解決問題。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/382478.html
