一对多烧瓶SQL炼金术 [英] One-to-many Flask | SQLAlchemy

查看:112
本文介绍了一对多烧瓶SQL炼金术的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试使用Flask和SQLAlchemy创建一对多关系.

I am trying to create a one-to-many relationship using Flask and SQLAlchemy.

我希望一对多关系是这样

I want the one-to-many relationship to be as so:

对于任何一部电影,都可以有多个字符"

"For any single movie, there can be multiple characters"

这里是我到目前为止的内容,但是现在它以一对一的形式保存在数据库中. (一部电影一个角色,在数据库中多次保存多个角色)

Here it what I have so far, but it is saving in my DB as one-to-one right now. (One movie to one character, saving multiple times in DB for multiple characters)

class Movie(db.Model):
    __tablename__ = "movies"
    id = db.Column('movies_id', db.Integer, primary_key=True)
    movie_type = db.Column('movie_type', db.Text())

    def __init__(self, movie_type):
        self.movie_type = movie_type

    def __repr__(self):
        return '<Movie %r>' % self.id

class Character(db.Model):
    __tablename__ = "characters"
    id = db.Column('character_id', db.Integer, primary_key=True) 
    character_description = db.Column('character_description', db.Text())

    movie_id = db.Column(db.Integer, db.ForeignKey('movies.movie_id'))
    movie = db.relationship('Movie', backref='characters', lazy='dynamic')

    def __init__(self, character_description, movie):
        self.character_description = character_description

        self.movie = movie

    def __repr__(self):
        return '<Character %r>' % self.id

我这样保存到数据库中:

I am saving into the DB like this:

movie = models.movie(movie_type)
character = models.Character(character_description, movie)

db.session.add(movie)
db.session.add(character)
db.session.commit()

最终目标是能够查找角色所在的电影.如果您也可以通过该查询帮助我,那就太好了!

The end goal is to be able to look up what movie a character is in. If you could also help me out with that query, that would be great!

提前谢谢.

推荐答案

好吧,我想您想念电影中的角色关系了+插入内容并不完全正确.

Well, I think you miss the characters relations in the movie + the insert was not totaly right.

您也必须小心一些细节.为什么电影的id是movieS_id,字符的id是character_id?

There is also little details that you have to be carefull. Why id of movie is movieS_id and id of character is character_id ?

此外,如果未指定,则列名与变量名相同.

Also, the name of the column is the same as the name of the variable if not specified.

例如,您可以这样做:

character_description = db.Column(db.Text())

无论如何,在不更改此详细信息的情况下,您可以尝试以下操作:

class Movie(db.Model):
    __tablename__ = "movies"
    id = db.Column('movies_id', db.Integer, primary_key=True)
    movie_type = db.Column('movie_type', db.Text())
    characters = db.relationship("Character", backref="movie", lazy='dynamic')
    def __init__(self, movie_type):
        self.movie_type = movie_type

    def __repr__(self):
        return '<Movie %r>' % self.id

class Character(db.Model):
    __tablename__ = "characters"
    id = db.Column('character_id', db.Integer, primary_key=True) 
    character_description = db.Column('character_description', db.Text())

    movie_id = db.Column(db.Integer, db.ForeignKey('movies.movies_id'))
    movie = db.relationship('Movie')

    def __init__(self, character_description, movie):
        self.character_description = character_description

        self.movie = movie

    def __repr__(self):
        return '<Character %r>' % self.id

插入

c = Character(character_description='c')
c2 = Character(character_description='c2')
m = Movie(movie_type ='action')

# link characters to movie
m.characters.append(c)
m.characters.append(c2)
# or
m.characters.extend([c,c2])

db.session.add(m)
# add characters
db.session.add(c)
db.session.add(c2)
# or
db.session.add_all([c,c2])
# commit
db.session.commit()

这篇关于一对多烧瓶SQL炼金术的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆