SQLAlchemy: AttributeError: Could not locate column in row for column '_sa_instance_state'
SQLAlchemy: AttributeError: Could not locate column in row for column '_sa_instance_state'
我有一个包含谜题和类别的多对多关系数据库。当我第一次 运行 它时,一切都非常顺利。所有表格都已创建并填充了内容。但是,当我 运行 第二次进一步填充数据库时,弹出以下错误。
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'>
,第二次,当它崩溃时,它是实例 <class 'sqlalchemy.engine.row.Row'>
.
有什么方法可以将变量类型转换为 class models.category 并查看这是否是解决方案?
错误信息
AttributeError: Could not locate column in row for column '_sa_instance_state'
乍一看比较晦涩。这意味着我们正在尝试执行某些特定于模型实例的操作,但正在执行操作的对象不是模型实例。
在这种特殊情况下,在执行
session.add(puzzle)
我们似乎要将 Puzzle
及其相关类别添加到会话中,但
的结果
db.session.query(Category.name).filter_by(name=cat).first()
将是一行(如 ('cat1',)
,因为我们正在检索属性 - Category.name
- 而不是模型实例。
将查询替换为
db.session.query(Category).filter_by(name=cat).first()
将检索模型实例并解决问题。
我有一个包含谜题和类别的多对多关系数据库。当我第一次 运行 它时,一切都非常顺利。所有表格都已创建并填充了内容。但是,当我 运行 第二次进一步填充数据库时,弹出以下错误。
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'>
,第二次,当它崩溃时,它是实例 <class 'sqlalchemy.engine.row.Row'>
.
有什么方法可以将变量类型转换为 class models.category 并查看这是否是解决方案?
错误信息
AttributeError: Could not locate column in row for column '_sa_instance_state'
乍一看比较晦涩。这意味着我们正在尝试执行某些特定于模型实例的操作,但正在执行操作的对象不是模型实例。
在这种特殊情况下,在执行
session.add(puzzle)
我们似乎要将 Puzzle
及其相关类别添加到会话中,但
db.session.query(Category.name).filter_by(name=cat).first()
将是一行(如 ('cat1',)
,因为我们正在检索属性 - Category.name
- 而不是模型实例。
将查询替换为
db.session.query(Category).filter_by(name=cat).first()
将检索模型实例并解决问题。