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

文章来源—知了课堂的课件


一、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 # 打印作者的所有文章的标题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值