Flask零基础到项目实战(四)SQLAlchemy数据库(三)
2017-08-28 18:24
375 查看
文章来源—知了课堂的课件
Python语句
Python语句
实例:
main.py
config.py
2.删除原来的article表,创建新的映射关系
3.添加新的文章
4.寻找文章的作者
利用反向引用(backref)来,根据作者名字,查找出作者写过的所有文章。
一、SQLAlchemy外键约束
1.创建外键约束表结构
目标:建立两个表“用户表(users)”和“文章表(article)”,其中文章表中的作者id是是用户表的id即外键的关系。1.用户表
SQL语句# 用户表 create table users( id int primary key autoincrement, username varchar(100) not null, )
Python语句
# 创建用户类 class Users(db.Model): __tablename__ = 'users' id = db.Column(db.Integer, primary_key=True, autoincrement=True) username = db.Column(db.String(100), nullable=False)
2.文章表
SQL语句# 文章表 create table article ( id int primary key autoincrement, title varchar(100) not null, content text not null, author_id int, foreign key 'author_id' references 'users.id' )
Python语句
# 创建文章类 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('users.id')) # 设置外键约束
实例:
main.py
# encoding:utf8
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 varchar(100) not null,
# content text not null,
# author_id int,
# foreign key 'author_id' references 'users.id'
# )
# 创建用户类 class Users(db.Model): __tablename__ = 'users' 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('users.id'))
db.create_all()
@app.route('/')
def hello_world():
# 增加:
article1 = Article(title='abc', content='aaabbbccc')
db.session.add(article1)
# 事务
db.session.commit()
return 'Hello World!'
if __name__ == '__main__':
app.run(debug=True)
config.py
# encoding:utf8 # dialect+driver://username:password@host:port/database DIALECT = 'mysql' DRIVER = 'mysqldb' USERNAME = 'root' PASSWORD = '' HOST = '127.0.0.1' PORT = '3306' DATABASE = 'db_demo' # 使用一种Python3的语法将连接数据的各种参数连接起来 SQLALCHEMY_DATABASE_URI = "{}+{}://{}:{}@{}:{}/{}?charset=utf8".format(DIALECT, DRIVER, USERNAME, PASSWORD, HOST , PORT, DATABASE) SQLALCHEMY_TRACK_MODIFICATIONS = True
2.数据库添加用户和文章
1.要想添加一篇文章,因为文章必须依赖用户而存在,所以首先要先添加一个用户。
user1 = Users(username='liefyuan') db.session.add(user1) db.session.commit()
2.在已经添加了用户的基础上添加一篇文章。
article1 = Article(title='aaa', content='bbbbbb', author_id=1) db.session.add(article1) db.session.commit()
3.查找文章的作者
方法一(繁琐):
# 首先查找文章标题为"aaa"的文章对象,该对象里面有作者id article = Article.query.filter(Article.title == 'aaa').first() # 然后根据作者id,由外键关系获取到用户的名字--作者名字 author_id = article.author_id user = Users.query.filter(Users.id == author_id).first() # 打印出作者名字 # print user.username print 'username:%s' % user.username
方法二(简单):
1.修改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('users.id')) author = db.relationship('Users', backref=db.backref('articles')) # 反向引用的方法
2.删除原来的article表,创建新的映射关系
3.添加新的文章
article = Article(title='aaa', content='bbbbbbb') article.author = Users.query.filter(Users.id == 1).first() db.session.add(article) db.session.commit()
4.寻找文章的作者
# 寻找文章标题为aaa的这个作者 article = Article.query.filter(Article.title == 'aaa').first() print 'username:%s' % article.author
4.列出某个作者写过的所有文章
命令行删除article表,在article表中添加新的关系,然后db.create_all()会自动生成新的表。利用反向引用(backref)来,根据作者名字,查找出作者写过的所有文章。
1.修改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('users.id')) author = db.relationship('Users', backref=db.backref('articles')) # 反向引用的方法
# 使用的方法
user = Users.query.filter(Users.username=='liefyuan').first()
result = user.articles # 作者写过的所有文章
for article in result:
print article.title # 打印作者的所有文章的标题
相关文章推荐
- Flask零基础到项目实战(四)SQLAlchemy数据库(四)
- Flask零基础到项目实战(四)SQLAlchemy数据库(二)
- Flask零基础到项目实战(四)SQLAlchemy数据库(一)
- 手把手0基础项目实战 · 微服务架构下的数据库分库分表实践
- JavaEE项目实战(OA系统)之三_数据库实现
- openstack-db-数据库之SQLAlchemy实战详解
- 项目实战(二)—你的数据库灵活吗?
- STS创建Spring Boot项目实战(Rest接口、数据库、用户认证、分布式Token JWT、Redis操作、日志和统一异常处理)
- 【springmvc+mybatis项目实战】杰信商贸-3.需求分析与数据库建模
- 类似于新论坛、微博实战项目开发包括服务器端和数据库,全部开源
- 我们的一个已投产项目的高可用数据库实战 - mongo 副本集的搭建具体过程
- 项目实战11—企业级nosql数据库应用与实战-redis的主从和集群
- java项目实战-超市管理系统(七)如何导入数据到数据库?Dao包源码与分析
- 【springmvc+mybatis项目实战】杰信商贸-2.数据库配置
- STS创建Spring Boot项目实战(Rest接口、数据库、用户认证、分布式Token JWT、Redis操作、日志和统一异常处理)
- Asp.Net Core 2.0 项目实战(4)ADO.NET操作数据库封装、 EF Core操作及实例
- 项目实战玩转数据库之上一篇下一篇
- 【SSH网上商城项目实战05】完成数据库的级联查询和分页
- 03(maven+SSH)网上商城项目实战之数据库设计(PMD)
- MySQL 数据库设计复习笔记及项目实战