如何将行插入表 sqlalchemy 对象?

Ima*_*Hpr 4 python sqlalchemy flask flask-sqlalchemy

我有一个表对象,它的名字是标签,我不知道如何在其中插入新行

这是我的表对象:

tags = db.Table('tags',
    db.Column('tag_id', db.Integer, db.ForeignKey('tag.id'), primary_key=True),
    db.Column('Post_id', db.Integer, db.ForeignKey('post.id'), primary_key=True)
)
Run Code Online (Sandbox Code Playgroud)

我尝试使用此查询进行测试:

db.session.add(tags(
        post_id = 1,
        tag_id = 2
))
Run Code Online (Sandbox Code Playgroud)

但我遇到了这个错误:

TypeError: 'Table' object is not callable
Run Code Online (Sandbox Code Playgroud)

The*_*le1 14

对于所述问题的实际答案,您需要Insert从表中获取一个对象:

ins = tags.insert().values(post_id=1, tag_id=2)
db.engine.execute(ins)
Run Code Online (Sandbox Code Playgroud)

  • `Engine.execute()` 在 2.0 中被删除。SQLAlchemy 文档建议执行 `Connection.execute()` https://docs.sqlalchemy.org/en/14/core/connections.html#sqlalchemy.engine.Engine.execute (4认同)

mas*_*lak 10

我鼓励您使用 SQLAlchemy ORM 方法。在你的情况下,它会是这样的:

from sqlalchemy import Column, ForeignKey, Integer
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()


class Tags(Base):
    __tablename__ = 'tags'

    tag_id = Column(Integer, primary_key=True)
    post_id = Column(Integer, ForeignKey('post.id'))


session.add(Tags(tag_id=1, post_id=2))
session.commit()
Run Code Online (Sandbox Code Playgroud)

一个表中不能有两个主键,我不鼓励你明确给出 tag_id,因为它是主键,数据库自己负责索引新行,使下面的语句有效 session.add(Tags(post_id=2))

检查 SQLAlchemy 站点,他们有很棒的文档、食谱和示例!

  • [问题背景](https://flask-sqlalchemy.palletsprojects.com/en/2.x/models/#many-to-many-relationships) (2认同)

Gab*_* H. 6

多对多关系在两个类之间添加了一个关联表。

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)
    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)
Run Code Online (Sandbox Code Playgroud)

现在您可以向表中插入数据:

>>> page = Page()
>>> tag = Tag()
>>> page.tags.append(tag)
>>> db.session.add(page)
>>> db.session.commit()
Run Code Online (Sandbox Code Playgroud)

阅读本文了解更多信息。