今天写Flask_SQLAlchemy的外键及其关系

### Flask-SQLAlchemy外键及其关系:

主app文件代码:

  1. from flask import Flask
  2. from flask_sqlalchemy import SQLAlchemy
  3. import config
  4.  
  5. app = Flask(__name__)
  6. app.config.from_object(config)
  7. db = SQLAlchemy(app)
  8.  
  9. # #用户表
  10. # create table users{
  11. # id int primary key autoincrement,
  12. # username varchar(100) not null
  13. # }
  14. # #文章表
  15. # create table article{
  16. # id int primary key autoincrement,
  17. # title varcar(100) not null,
  18. # content text not null
  19. # author id int,
  20. # foreign key 'author_id' references 'user.id'
  21. # }
  22.  
  23. class User(db.Model):
  24. __tablename__ = 'user'
  25. id = db.Column(db.Integer, primary_key=True, autoincrement=True)
  26. username = db.Column(db.String(100), nullable=False)
  27. #content = db.Column(db.Text, nullable=False)
  28.  
  29. class Article(db.Model):
  30. __tablename__ = 'article'
  31. id = db.Column(db.Integer, primary_key=True, autoincrement=True)
  32. title = db.Column(db.String(100), nullable=False)
  33. content = db.Column(db.Text, nullable=False)
  34. author_id = db.Column(db.Integer,db.ForeignKey('user.id'))#注意是表名
  35.  
  36. author = db.relationship('User',backref=db.backref('articles'))
  37.  
  38. db.create_all()
  39.  
  40. @app.route('/')
  41. def index():
  42. # #想要添加一篇文章,因为文章必须依赖用户而存在,所以首先添加一个用户
  43. # user1 = User(username = 'hyq')
  44. # db.session.add(user1)
  45. # db.session.commit()
  46.  
  47. # article = Article(title = 'aaa',content = 'bbb',author_id=1)
  48. # db.session.add(article)
  49. # db.session.commit()
  50. #
  51. #我要找文章标题为aaa的这个作者
  52. article = Article.query.filter(Article.title == 'aaa').first()
  53. author_id = article.author_id
  54. user = User.query.filter(User.id == author_id).first()
  55. print("username:%s" % user.username)
  56.  
  57. # article.author
  58. # author = User.query.filter(User.username=='hyq').first()
  59. # author.articles
  60.  
  61. # article = Article(title='aaa',content='bbb')
  62. # article.author = User.query.filter(User.id == 1).first()
  63. # db.session.add(article)
  64. # db.session.commit()
  65.  
  66. # # 我要找文章标题为aaa的这个作者
  67. # article = Article.query.filter(Article.title == 'aaa').first()
  68. # print('username:%s' % article.author.username)
  69.  
  70. # #我要找到hyq这个用户写过的所有文章
  71. # article = Article(title = '111',content='222',author_id =1)
  72. # db.session.add(article)
  73. # db.session.commit()
  74. # user = User.query.filter(User.username == 'hyq').first()
  75. # result = user.articles
  76. # for article in result:
  77. # print('-'*10)
  78. # print(article.title)
  79. return 'index'
  80.  
  81. if __name__ == '__main__':
  82. app.run(debug=True)

1. 外键:
```
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'))
```
2. `author = db.relationship('User',backref=db.backref('articles'))`解释:
* 给`Article`这个模型添加一个`author`属性,可以访问这篇文章的作者的数据,像访问普通模型一样。
* `backref`是定义反向引用,可以通过`User.articles`访问这个模型所写的所有文章。

3.多对多的情况:

主app文件代码:

  1. from flask import Flask
  2. from flask_sqlalchemy import SQLAlchemy
  3. import config
  4.  
  5. app = Flask(__name__)
  6. app.config.from_object(config)
  7. db = SQLAlchemy(app)
  8.  
  9. # #用户表
  10. # create table article{
  11. # id int primary key autoincrement,
  12. # title varchar(100) not null
  13. # }
  14. # #文章表
  15. # create table tag{
  16. # id int primary key autoincrement,
  17. # name varcar(100) not null,
  18. # foreign key 'author_id' references 'user.id'
  19. # }
  20.  
  21. # create table article_tag(
  22. # article_id int,
  23. # tag_id int,
  24. # primary key('article_id','tag_id'),
  25. # foreign key 'article_id' reference 'article.id',
  26. # foreign key 'tag_id' reference 'tag.id'
  27. # )
  28. article_tag = db.Table('article_tag',
  29. db.Column('article_id',db.Integer,db.ForeignKey('article.id'),primary_key=True),
  30. db.Column('tag_id',db.Integer,db.ForeignKey('tag.id'),primary_key=True)
  31. )
  32.  
  33. class Article(db.Model):
  34. __tablename__ = 'article'
  35. id = db.Column(db.Integer, primary_key=True, autoincrement=True)
  36. title = db.Column(db.String(100), nullable=False)
  37. tags = db.relationship('Tag',secondary='article_tag',backref=db.backref('articles'))
  38.  
  39. class Tag(db.Model):
  40. __tablename__ = 'tag'
  41. id = db.Column(db.Integer, primary_key=True, autoincrement=True)
  42. name = db.Column(db.String(100),nullable=False)
  43.  
  44. db.create_all()
  45.  
  46. @app.route('/')
  47. def index():
  48.  
  49. # article1 = Article(title = 'aaa')
  50. # article2 = Article(title='bbb')
  51. #
  52. # tag1 = Tag(name='111')
  53. # tag2 = Tag(name='222')
  54. #
  55. # article1.tags.append(tag1)
  56. # article1.tags.append(tag2)
  57. #
  58. # article2.tags.append(tag1)
  59. # article2.tags.append(tag2)
  60. #
  61. # db.session.add_all([article1,article2,tag1,tag2])
  62. # db.session.commit()
  63.  
  64. article1 = Article.query.filter(Article.title == 'aaa').first()
  65. tags = article1.tags
  66. for tag in tags:
  67. print(tag.name)
  68.  
  69. return 'index'
  70.  
  71. if __name__ == '__main__':
  72. app.run(debug=True)

3. 多对多:
* 多对多的关系,要通过一个中间表进行关联。
* 中间表,不能通过`class`的方式实现,只能通过`db.Table`的方式实现。
* 设置关联:`tags = db.relationship('Tag',secondary=article_tag,backref=db.backref('articles'))`需要使用一个关键字参数`secondary=中间表`来进行关联。
* 访问和数据添加可以通过以下方式进行操作:
- 添加数据:
```
article1 = Article(title='aaa')
article2 = Article(title='bbb')

tag1 = Tag(name='111')
tag2 = Tag(name='222')

article1.tags.append(tag1)
article1.tags.append(tag2)

article2.tags.append(tag1)
article2.tags.append(tag2)

db.session.add(article1)
db.session.add(article2)

db.session.add(tag1)
db.session.add(tag2)

db.session.commit()
```
- 访问数据:
```
article1 = Article.query.filter(Article.title == 'aaa').first()
tags = article1.tags
for tag in tags:
print tag.name
```

Flask web开发之路八的更多相关文章

  1. Flask web开发之路九

    flask_scripts介绍 项目结构如下: flask_script_demo.py文件: from flask import Flask app = Flask(__name__) @app.r ...

  2. Flask web开发之路一

    之前学过一段时间的flask,感觉还是挺好用的,自己的专利挖掘项目也想这个web框架来搭建,于是重新开始基础学习 环境:win10,python3.6,pycharm2017,虚拟环境virtuale ...

  3. Flask web开发之路十四

    今天开始Flask的实战,创建一个项目,实现包括用户登录.注册.注销.发表博客.评论以及检索等功能 首先给出项目结构: 1.config.py文件: 存放各种配置信息 import os # dial ...

  4. Flask web开发之路十三

    g对象 ### 保存全局变量的g属性:g:global1. g对象是专门用来保存用户的数据的.2. g对象在一次请求中的所有的代码的地方,都是可以使用的. 项目结构: g_demo.py文件代码: f ...

  5. Flask web开发之路十二

    ge请求和post请求 ### get请求和post请求:1. get请求: * 使用场景:如果只对服务器获取数据,并没有对服务器产生任何影响,那么这时候使用get请求. * 传参:get请求传参是放 ...

  6. Flask web开发之路十一

    首先写一下cookie和session的概念,然后是Flask中session的工作机制以及操作session ### cookie: 1. `cookie`出现的原因:在网站中,http请求是无状态 ...

  7. Flask web开发之路十

    首先介绍循环引用的问题: 当一个模块需要引用另一个模块的类,而另一个模块又需要引用这个模块的类时,就出现了循环引用,而没法导入类,这时候可以切断其中一条引用路径,增加一个模块 项目结构: models ...

  8. Flask web开发之路七

    今天写SQLAlchemy数据库 首先介绍ORM的概念: ORM,Object类,Relationship:关系,Mapping:映射,也就是模型关系映射 flask-sqlalchemy是一套ORM ...

  9. Flask web开发之路六

    紧接着上篇文档,写模板继承和block,URL链接和加载静态文件 模板继承和block 项目结构 主app文件代码: from flask import Flask,render_template a ...

随机推荐

  1. Mac下打开多个eclipse

    命令行执行: open -n /Eclipse所在路径/Eclipse.app  

  2. QueryRunner实战(query_update)、BeanList\BeanHandler、MapList\MapHandler、ScalarHandler

    1.c3p0-config.xml <?xml version="1.0" encoding="UTF-8"?> <c3p0-config&g ...

  3. 安装Logtail(Linux系统)

    Logtail客户端是日志服务提供的日志采集客户端,请参考本文档,在Linux服务器上安装Logtail客户端. 支持的系统 支持如下版本的Linux x86-64(64位)服务器: Aliyun L ...

  4. JAVA 自定义注解在自动化测试中的使用

    在UI自动化测试中,相信很多人都喜欢用所谓的PO模式,其中的P,也就是page的意思,于是乎,在脚本里,或者在其它的page里,会要new很多的page对象,这样很麻烦,前面我们也讲到了注解的使用,很 ...

  5. DropDMG for Mac(dmg 文件打包工具)破解版安装

    1.软件简介    DropDMG 是 macOS 系统上的一款帮助用户快速打包 DMG 文件的 Mac 文件管理软件,DropDMG 不但可以将影像档加密.更可以配合 GZip .BZip2 .Ma ...

  6. docker镜像、容器以及命令操作

    docker image docker image是一个极度精简版的Linux程序运行环境,官网的java镜像包括的东西更少,除非是镜像叠加方式的如centos+java7 docker image是 ...

  7. 第三部分:Android 应用程序接口指南---第三节:应用程序资源---第一章 资源提供

    第1章 资源提供 你应该经常外部化你应用程序代码中的资源,比如图片.字符串等,这样有利于你独立处理这些资源.你也应该根据特定的设备配置提供一些可替代的资源,并且把他们分组保存在指定的路径名下.运行时, ...

  8. Verilog TestBench Coding Style

    Abtract 关于编写testbench的一些经验总结心得. Introduction 1.基本的Testbench结构 1)常用的编码结构 `timescale 1 ns / 1 ps       ...

  9. python 列表排序方法sort、sorted技巧篇

    Python list内置sort()方法用来排序,也可以用python内置的全局sorted()方法来对可迭代的序列排序生成新的序列. 1)排序基础 简单的升序排序是非常容易的.只需要调用sorte ...

  10. 在webpack中使用postcss-px2rem的

    经过一番折腾重要搞定了. 首先需要安装postcss-plugin-px2rem. npm install --save-dev postcss-plugin-px2rem 我的webpack工程中没 ...