我想使用Flask-SQLAlchemy创建一个多对多关系,但即使是最简单的例子也失败了。 我使用了此处链接中的示例代码,并添加了在文件调用 app.py 中获取此功能的基本要素:
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///test.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db = SQLAlchemy(app)
tags = db.Table('tags',
db.Column('tag_id', db.Integer, db.ForeignKey('tag.id'), primary_key=True),
db.Column('page_id', db.Integer, db.ForeignKey('page.id'), primary_key=True)
)
class Page(db.Model):
id = db.Column(db.Integer, primary_key=True)
page_name = db.Column(db.String(30))
tags = db.relationship('Tag', secondary=tags, lazy='subquery',
backref=db.backref('pages', lazy=True))
class Tag(db.Model):
id = db.Column(db.Integer, primary_key=True)
tag_name = db.Column(db.String(30))
然后我在 Python 命令行中键入:
from app import *
db.create_all()
它已正确创建文件,我可以看到三个表。 完善!
我现在如何创建此示例中的页面和标签...我期望像这样:
new_page = Page(tags=["tagone"])
但是我得到一个错误:
属性错误:"str"对象没有属性"_sa_instance_state
我不知道从哪里开始说实话..
我通过更多的搜索和测试弄清楚了。 我不确定这是否是最佳实践,但它有效:
new_page_too = Page(page_name='Johnny New')
new_tag = Tag(tag_name='Solved')
new_tag_too = Tag(tag_name='Fixed It!')
new_page_too.tags.append(new_tag)
new_page_too.tags.append(new_tag_too)
db.session.add(new_page_too)
db.session.commit()
非常高兴,我喜欢SQLAlchemy:-(
也多亏了评论,您也可以这样做:
new_page = Page(page_name='Johnny Third', tags=[Tag(tag_name='Tag1Test'), Tag(tag_name='Tag2Test')])