How can i insert row into table sqlalchemy object?

Question:

i have table object that its name is tags and i don’t know how to insert new row into it

this is my table object :

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

i tried to use this query for test :

db.session.add(tags(
        post_id = 1,
        tag_id = 2
))

But I encountered this error :

TypeError: 'Table' object is not callable
Asked By: user8424164

||

Answers:

I encourage you to use SQLAlchemy ORM approach. In your case it would be something like this:

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, ForeignKey('tags.id'), primary_key=True)
    post_id = Column(Integer, ForeignKey('posts.id'), primary_key=True)


session.add(Tags(tag_id=1, post_id=2))
session.commit()

Check SQLAlchemy site, they have great docs, recipes and examples!

Answered By: maslak

A many-to-many relationship adds an association table between the two models.

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)

Now you can insert data into the table:

>>> page = Page()
>>> tag = Tag()
>>> page.tags.append(tag)
>>> db.session.add(page)
>>> db.session.commit()

Read this for more information.

Answered By: Gabe

An actual answer for the stated question, you need to get an Insert object from the table:

ins = tags.insert().values(post_id=1, tag_id=2)
db.engine.execute(ins)
Answered By: Maximilian Burszley