美文网首页Flask交流
十、SQLAlchemy的外键约束

十、SQLAlchemy的外键约束

作者: 十柒年 | 来源:发表于2018-09-07 17:01 被阅读50次

    1.写好配置文件

    今天来和大家一块学习下SQLAlchemy的外键约束。我们先添加一个config.py用来写连接MySQL的参数。代码如下。

    DIALECT = 'mysql'  # 要用的什么数据库
    DRIVER = 'pymysql'  # 连接数据库驱动
    USERNAME = 'root'  # 用户名
    PASSWORD = 'root'  # 密码
    HOST = 'localhost'  # 服务器
    PORT = '3306'  # 端口
    DATABASE = 'db_demo3'  # 数据库名
    
    SQLALCHEMY_DATABASE_URI = "{}+{}://{}:{}@{}:{}/{}?charset=utf8".format(DIALECT, DRIVER, USERNAME, PASSWORD, HOST, PORT, DATABASE)
    SQLALCHEMY_TRACK_MODIFICATIONS = False
    

    这里咱们新建了一个数据库叫db_demo3.sql语句如下

    create database db_demo3;
    

    创建好数据库之后,导入SQLAlchemy,在创建两个类。一个User 一个Article,代码如下。其中Article表中有一个author_id 字段,是一个外键,对应User表的中的id。外键写法db.ForeignKey('user.id')

    # 用户表
    class User(db.Model):
        __tablename__ = 'user'
        id = db.Column(db.INTEGER, primary_key=True,autoincrement=True)
        username = db.Column(db.String(100),nullable=False)
    # 文章表
    class Article(db.Model):
        __tablename__ = 'article'
        id = db.Column(db.INTEGER,primary_key=True,autoincrement=True)
        title = db.Column(db.String(100),nullable=False)
        content = db.Column(db.Text,nullable=False)
        author_id = db.Column(db.INTEGER,db.ForeignKey('user.id'))
    db.create_all()
    

    然后添加几条记录。如下

        user1 = User(username='zhangsan')
        db.session.add(user1)
        db.session.commit()
    
        article1 = Article(title='aaa',content='bbb',author_id=1)
        db.session.add(article1)
        db.session.commit()
    

    然后咱们如何获取文章名为aaa 作者是谁呢?是不是需要先找到,title名为aaa的这条记录中的author_id,然后在去User表中找到这个用户的名字对吧。代码如下

        article = Article.query.filter(Article.title=='aaa').first()
        user = User.query.filter(User.id==article.author_id).first()
        print(user.username)
    

    挺麻烦的,这时候就该外键约束登场了,先把article表删了,重新创建一个article表,代码如下。

    class Article(db.Model):
        __tablename__ = 'article'
        id = db.Column(db.INTEGER,primary_key=True,autoincrement=True)
        title = db.Column(db.String(100),nullable=False)
        content = db.Column(db.Text,nullable=False)
        author_id = db.Column(db.INTEGER,db.ForeignKey('user.id'))
        author = db.relationship('User',backref=db.backref('articles'))  # 反向引用backref  找到该作者做的所有文章
    

    其中author = db.relationship('User',backref=db.backref('articles')) 中的author也是一个对象,另外在里面用了一个反向引用,这样就很方便找到 该文章的作者的所有文章。听着有点绕,咱们写段代码就明白了。还是刚才的需求,找到标题为aaa的作者名字。代码如下。

        # 找到文章标题为aaa的作者
        article = Article.query.filter(Article.title=='aaa').first()
        print(article.author.username)
    

    还是先把从article表中找到的记录放到article中,然后用article.author.username直接就可以获取作者名字,是不是比刚才方便了一些。如果说要找到该作者写的所有文章该怎么去查询?代码如下,

        user = User.query.filter(User.username=='zhangsan').first()
        result = user.articles
        for article in result:
            print("-"*10)
            print(article.title)
    

    这里咱们先从User表中找到zhangsan这个用户,然后注意,直接就可以通过user.articles获得该作者的所有文章,为什么可以用user.articles呢,因为咱们在定义外键约束的时候,写了一个反向引用。这就是SQLAlchemy的强大。完整代码如下。数据库等需要自行调整。
    app.py

    from flask import Flask
    from flask_sqlalchemy import SQLAlchemy
    import config
    app = Flask(__name__)
    
    app.config.from_object(config)
    db = SQLAlchemy(app)
    
    # 用户表
    class User(db.Model):
        __tablename__ = 'user'
        id = db.Column(db.INTEGER, primary_key=True,autoincrement=True)
        username = db.Column(db.String(100),nullable=False)
    # 文章表
    class Article(db.Model):
        __tablename__ = 'article'
        id = db.Column(db.INTEGER,primary_key=True,autoincrement=True)
        title = db.Column(db.String(100),nullable=False)
        content = db.Column(db.Text,nullable=False)
        author_id = db.Column(db.INTEGER,db.ForeignKey('user.id'))
        author = db.relationship('User',backref=db.backref('articles'))  # 反向引用backref  找到该作者做的所有文章
    db.create_all()
    @app.route('/')
    def index():
        # user1 = User(username='zhangsan')
        # db.session.add(user1)
        # db.session.commit()
        #
        # article1 = Article(title='aaa',content='bbb',author_id=1)
        # db.session.add(article1)
        # db.session.commit()
    
        # article = Article.query.filter(Article.title=='aaa').first()
        # user = User.query.filter(User.id==article.author_id).first()
        # print(user.username)
    
        # article = Article(title='aaa',content='bbb')
        # article.author= User.query.filter(User.id==1).first()
        # db.session.add(article)
        # db.session.commit()
    
        # 找到文章标题为aaa的作者
        # article = Article.query.filter(Article.title=='aaa').first()
        # print(article.author.username)
    
        # 找到张三这个用户写过的所有文章
        # article = Article(title='111',content='222',author_id=1)
        # db.session.add(article)
        # db.session.commit()
        user = User.query.filter(User.username=='zhangsan').first()
        result = user.articles
        for article in result:
            print("-"*10)
            print(article.title)
        return 'index'
    
    
    if __name__ == '__main__':
        app.run()
    

    好了,就说这么多。
    Study hard and make progress every day.

    更多学习资料请关注"爱游戏爱编程"。


    爱游戏爱编程.jpg

    相关文章

      网友评论

        本文标题:十、SQLAlchemy的外键约束

        本文链接:https://www.haomeiwen.com/subject/ysmcgftx.html