【python-flask学习笔记】3.2 SQLAlchemy-数据增删改查及外键约束

准备工作

(1)设置配置信息config.py

# 数据库连接遵循这个语句
# dialect+driver://username:password@localhost:port/database?charset=utf8
DIALECT = 'mysql'
DRIVER = 'pymysql'
USERNAME = 'root'
PASSWORD = 'root'
HOST = '127.0.0.1'
PORT = '3306'
DATABASE = 'db_dome1'   #要连接的数据库的名称,要先创建好这个数据库

SQLALCHEMY_DATABASE_URI = "{}+{}://{}:{}@{}:{}/{}?charset=utf8".format(DIALECT,DRIVER,USERNAME,PASSWORD,HOST,PORT,DATABASE)

SQLALCHEMY_TRACK_MODIFICATIONS = False      # 不提示警告

(2)配置连接及表映射simple.py


from flask import Flask
from flask_sqlalchemy import SQLAlchemy
import config
 
app = Flask(__name__)       #引入配置文件
app.config.from_object(config)
db = SQLAlchemy(app)
 
# 一定要记得让其继承自db.Model
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):    #模型必须继承db.Model
    #db.Column映射到表中字段,primary_key主键,autoincrement自增,nullable可为空(默认为True)
    __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'))#user是表名,关联user表的id字段
    
    #反向引用,'User'为模型名字,即上面定义的类名
    author = db.relationship('User',backref=db.backref('article'))
 
db.create_all() 
 
@app.route('/')
def index():
    return "hello world"
 
if __name__ == '__main__':
    app.run(debug=True)

运行完上述simple.py程序后,即成功创建了名为db_dome1的数据库,及在改数据库下创建了userarticle这两个数据表。

下面以对article表进行增删改查的操作为例:

* 增加

修改simple.py中的index装饰器函数为以下代码:

article = Article(title='aaa',content='bbbb')   #实例对象
db.session.add(article) #绘制SQL语句,只是暂时放在了session中,并为真正将该条数据添加到数据表里
db.session.commit() #提交事务,执行,执行该条语句才真正将该条数据添加到数据表里
    

上述语句被执行后,在Navicat中即可查看到该条数据被加到数据表中。

* 查询


article1 = Article.query.filter(Article.id == '2').first()    #返回第一条数据,若没有也不会报错
article2 = Article.query.filter(Article.id == '2').all()      #返回所有条数据,是一个列表

title = article1.title
content = article1.content

* 修改

result = Article.query.filter(Article.id == '2').first()     # 先查找 获取第一条数据
result.title = '新的数据'        #以操作对象的方式修改数据
db.session.commit()             #提交事务,执行

* 删除

result = Article.query.filter(Article.id == '2').first()     # 先查找 获取第一条数据
db.session.delete(result)           #以delete方法删除
db.session.commit()             #提交事务,执行        

注:

  • .first()是取满足条件的第一条数据,不写这个的话,得到的是满足查询条件的所有条数据组成的列表,

外键约束

有两个表,用户表(users)与文章表(article)。其中文章表中的作者id是来自用户表的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')) # 设置外键约束

小需求:

(1)查找文章作者

方法一:(笨方法,不推荐)

# 首先查找文章标题为"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('username:%s' % user.username)

方法二:

  • 修改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'))
    author = db.relationship('Users', backref=db.backref('articles')) # 第二个参数是反向引用的方法

其中最后一行author = db.relationship('Users', backref=db.backref('articles'))的解释:是给Article这个模型添加'author'这个属性,可以访问这篇文章的作者的数据,像访问普通模型一样。backref是定义反向引用,可以通过User.article访问这个模型所写的所有文章

  • 查找文章作者
article = Article.query.filter(Article.title == 'aaa').first()
print('username:%s' % article.author)

(2)列出某作者所有文章

前提是文章类需要有反向引用的方法 即author = db.relationship('Users', backref=db.backref('articles'))

user = Users.query.filter(Users.username=='Jyang').first()  # 获取作者
result = user.articles   # 获取作者写过的所有文章,是由于前面Article类设置了反向引用才能直接写user.articles
for article in result:
    print(article.title) # 打印作者的所有文章的标题

以上笔记整理自知了课堂黄勇老师讲解的教学视频《Flask框架入门到实战开发》的第三章第7-8小节的学习笔记,不足之处,望不吝赐教!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用flask-sqlalchemy进行增删改查操作非常方便。下面是一些示例代码来说明如何使用flask-sqlalchemy进行增删改查操作: 1. 增加数据: 使用模型类的构造函数创建一个新的对象,并将其添加到数据库会话中,然后使用会话的`add()`方法将其添加到数据库中。 示例代码如下: ``` from flask_sqlalchemy import SQLAlchemy db = SQLAlchemy() class User(db.Model): id = db.Column(db.Integer, primary_key=True) username = db.Column(db.String(80), unique=True) email = db.Column(db.String(120), unique=True) user = User(username='John', email='john@example.com') db.session.add(user) db.session.commit() ``` 2. 删除数据: 使用模型类的`query`属性和`filter_by()`方法来筛选要删除的数据,并使用会话的`delete()`方法将其从数据库中删除。 示例代码如下: ``` user = User.query.filter_by(username='John').first() db.session.delete(user) db.session.commit() ``` 3. 修改数据: 使用模型类的`query`属性和`filter_by()`方法来筛选要修改的数据,并通过修改对象的属性来更新数据。 示例代码如下: ``` user = User.query.filter_by(username='John').first() user.email = 'new_email@example.com' db.session.commit() ``` 4. 查询数据: 使用模型类的`query`属性和各种查询方法来检索数据,例如`all()`方法获取所有数据,`filter_by()`方法根据条件筛选数据等。 示例代码如下: ``` users = User.query.all() # 获取所有用户数据 user = User.query.filter_by(username='John').first() # 根据用户名获取用户数据 ``` 这些是使用flask-sqlalchemy进行增删改查操作的基本示例。你可以根据需要进行调整和扩展来实现特定的功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值