Flask web开发之路八
今天写Flask_SQLAlchemy的外键及其关系
### Flask-SQLAlchemy外键及其关系:
主app文件代码:
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
import config app = Flask(__name__)
app.config.from_object(config)
db = SQLAlchemy(app) # #用户表
# create table users{
# id int primary key autoincrement,
# username varchar(100) not null
# }
# #文章表
# create table article{
# id int primary key autoincrement,
# title varcar(100) not null,
# content text not null
# author id int,
# foreign key 'author_id' references '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)
#content = db.Column(db.Text, 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')) db.create_all() @app.route('/')
def index():
# #想要添加一篇文章,因为文章必须依赖用户而存在,所以首先添加一个用户
# user1 = User(username = 'hyq')
# db.session.add(user1)
# db.session.commit() # article = Article(title = 'aaa',content = 'bbb',author_id=1)
# db.session.add(article)
# db.session.commit()
#
#我要找文章标题为aaa的这个作者
article = Article.query.filter(Article.title == 'aaa').first()
author_id = article.author_id
user = User.query.filter(User.id == author_id).first()
print("username:%s" % user.username) # article.author
# author = User.query.filter(User.username=='hyq').first()
# author.articles # 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('username:%s' % article.author.username) # #我要找到hyq这个用户写过的所有文章
# article = Article(title = '111',content='222',author_id =1)
# db.session.add(article)
# db.session.commit()
# user = User.query.filter(User.username == 'hyq').first()
# result = user.articles
# for article in result:
# print('-'*10)
# print(article.title)
return 'index' if __name__ == '__main__':
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文件代码:
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
import config app = Flask(__name__)
app.config.from_object(config)
db = SQLAlchemy(app) # #用户表
# create table article{
# id int primary key autoincrement,
# title varchar(100) not null
# }
# #文章表
# create table tag{
# id int primary key autoincrement,
# name varcar(100) not null,
# foreign key 'author_id' references 'user.id'
# } # create table article_tag(
# article_id int,
# tag_id int,
# primary key('article_id','tag_id'),
# foreign key 'article_id' reference 'article.id',
# foreign key 'tag_id' reference 'tag.id'
# )
article_tag = db.Table('article_tag',
db.Column('article_id',db.Integer,db.ForeignKey('article.id'),primary_key=True),
db.Column('tag_id',db.Integer,db.ForeignKey('tag.id'),primary_key=True)
) class Article(db.Model):
__tablename__ = 'article'
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
title = db.Column(db.String(100), nullable=False)
tags = db.relationship('Tag',secondary='article_tag',backref=db.backref('articles')) class Tag(db.Model):
__tablename__ = 'tag'
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
name = db.Column(db.String(100),nullable=False) db.create_all() @app.route('/')
def index(): # 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_all([article1,article2,tag1,tag2])
# db.session.commit() article1 = Article.query.filter(Article.title == 'aaa').first()
tags = article1.tags
for tag in tags:
print(tag.name) return 'index' if __name__ == '__main__':
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开发之路八的更多相关文章
- Flask web开发之路九
flask_scripts介绍 项目结构如下: flask_script_demo.py文件: from flask import Flask app = Flask(__name__) @app.r ...
- Flask web开发之路一
之前学过一段时间的flask,感觉还是挺好用的,自己的专利挖掘项目也想这个web框架来搭建,于是重新开始基础学习 环境:win10,python3.6,pycharm2017,虚拟环境virtuale ...
- Flask web开发之路十四
今天开始Flask的实战,创建一个项目,实现包括用户登录.注册.注销.发表博客.评论以及检索等功能 首先给出项目结构: 1.config.py文件: 存放各种配置信息 import os # dial ...
- Flask web开发之路十三
g对象 ### 保存全局变量的g属性:g:global1. g对象是专门用来保存用户的数据的.2. g对象在一次请求中的所有的代码的地方,都是可以使用的. 项目结构: g_demo.py文件代码: f ...
- Flask web开发之路十二
ge请求和post请求 ### get请求和post请求:1. get请求: * 使用场景:如果只对服务器获取数据,并没有对服务器产生任何影响,那么这时候使用get请求. * 传参:get请求传参是放 ...
- Flask web开发之路十一
首先写一下cookie和session的概念,然后是Flask中session的工作机制以及操作session ### cookie: 1. `cookie`出现的原因:在网站中,http请求是无状态 ...
- Flask web开发之路十
首先介绍循环引用的问题: 当一个模块需要引用另一个模块的类,而另一个模块又需要引用这个模块的类时,就出现了循环引用,而没法导入类,这时候可以切断其中一条引用路径,增加一个模块 项目结构: models ...
- Flask web开发之路七
今天写SQLAlchemy数据库 首先介绍ORM的概念: ORM,Object类,Relationship:关系,Mapping:映射,也就是模型关系映射 flask-sqlalchemy是一套ORM ...
- Flask web开发之路六
紧接着上篇文档,写模板继承和block,URL链接和加载静态文件 模板继承和block 项目结构 主app文件代码: from flask import Flask,render_template a ...
随机推荐
- SpringBootWEB项目和非Web项目的全局异常捕获
一.简介 SpringBoot的WEB异常捕获,如果是WEB项目的话,可以直接处理Controller中的异常.如果不是WEB项目的话,就需要使用AspectJ来做切面. 二.WEB项目 packag ...
- OpenWrt 18.06.1的ss-redir, 以及在乐视超4 X40上看Youtube
在18.06里面要设个透明代理, 就一直不成功 各种TIME OUT, PRIVATE SSL ERROR, 换回旧版的luci-app-shadowsocks也不行. 我就一直想, 到底这东西还能有 ...
- 基于Ubuntu部署 memcached 服务
系统要求:Ubuntu 16.04.1 LTS 64 位操作系统 安装并启动 memcached 服务 安装 memcached 使用apt-get安装 memcached sudo apt-get ...
- 如何将Ubuntu Server 12.04 升级到 Ubuntu Server 14.04 LTS
升级Ubuntu 12.04到Ubuntu 14.04方法如下: 步骤一:在终端中运行下面的命令,它将安装所有的升级包.$ sudo apt-get update && sudo ap ...
- Android 手动调用 返回键
有人想通过下面代码来实现手动调用返回键,很可惜会出现空指针异常. this.onKeyDown(KeyEvent.KEYCODE_BACK, null); 我们可以通过调用 onBackPressed ...
- C++的子类与父类强制转换产生的问题
近日,在项目的一个类中如果碰上想要将子类强制转换成父类,然后再调用其父类版本的virtual虚函数. 就会出现gcc编译错误提示:error: ld returned 1 exit status gc ...
- Bash 中的特殊字符大全【转】
Linux下无论如何都是要用到shell命令的,在Shell的实际使用中,有编程经验的很容易上手,但稍微有难度的是shell里面的那些个符号,各种特殊的符号在我们编写Shell脚本的时候如果能够用的好 ...
- GuavaCache学习笔记一:自定义LRU算法的缓存实现
前言 今天在看GuavaCache缓存相关的源码,这里想到先自己手动实现一个LRU算法.于是乎便想到LinkedHashMap和LinkedList+HashMap, 这里仅仅是作为简单的复习一下. ...
- Json字符串转DataTable
/// <summary> /// 将json转换为DataTable /// </summary> /// <param name="strJson" ...
- SpringBoot打war包并部署到外部tomcat运行(jar工程改造为正war工程)
如果你的SpringBoot工程是一个jar工程,而想把它改造成war工程,并打成war包放到外部的tomcat下运行,该怎么修改配置呢?这里以Maven工程为例进行介绍. (1)将pom.xml中的 ...