您的位置:首页 > 数据库

Flask零基础到项目实战(四)SQLAlchemy数据库(三)

2017-08-28 18:24 375 查看
文章来源—知了课堂的课件

一、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 # 打印作者的所有文章的标题
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐