Reputation:
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
Upvotes: 10
Views: 37871
Reputation: 995
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.
Upvotes: 7
Reputation: 1245
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!
Upvotes: 21
Reputation: 19634
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)
Upvotes: 20