ORM模型框架flask-sqlachemy封装了所有数据库操作,简单容易上手,学会了后对数据操作将会变得so easy
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
import config
"""
MySql-python中间键,驱动(python2)
Python3需要安装的MySQL库是mysqlclient
ORM:Object Relationship Mapping(模型关系映射)
flask-sqlachemy是一套ORM框架
ORM的好处:可以让我们操作数据库跟操作对像是一样,非常方便,因为一个表就抽象成一个类,一条数据就抽象成该类的一个对象
flask-sqlachemy使用
*使用flask-sqlachemy中的SQLAlchemy()进行初始倾听
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy(app)
设置配置信息
在config.py文件中添加以下配置信息
#dialect+driver://username:password@host:port/database
DEALECT = 'mysql'
DRIVER = 'mysqldb'
USERNAME = 'root'
PASSWORD = 'kk1234'
HOST = '192.168.0.101'
PORT = '3306'
DATABASE = 'db_demo1'
SQLALCHEMY_DATABASE_URI = "{}+{}://{}:{}@{}:{}/{}?charset=utf8".format(DEALECT,DRIVER,USERNAME,PASSWORD,HOST,PORT,DATABASE)
SQLALCHEMY_TRACK_MODIFICATIONS = False
在主app文件中添加配置文件
app.config.from_object(config)
测试,看有没有问题
db.create_all()
如果没有报错,就没有问题,有如果有错误 ,可以根据错误进行修改
"""
app = Flask(__name__)
app.config.from_object(config)
db = SQLAlchemy(app)
db.create_all()
@app.route('/')
def hello_world():
return 'Hello World!'
if __name__ == '__main__':
app.run(debug=True)
"""
创建模型表
1、模型需要继承自db.Model,然后需要映射到表中的属性,必须写成db.Column的数据类型
2、数据类型:
db.Integer代表是整形,
db.String代表的是varchar,需要指定长度
db.Text代表的是text
3、其他参数:
primary_key: 代表的装饰这个字段设置为主键
autoincrement:代表的是这个主键为自增长的
nullable:代表这个字段是否可以为空,默认可以为空,可以将此值设置为False,就不能为空了、
4、调用db.create_all 来将模型创建到数据库中
"""
app = Flask(__name__)
app.config.from_object(config)
db = SQLAlchemy(app)
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)
db.create_all()
@app.route('/')
def hello_world():
return 'Hello World!'
if __name__ == '__main__':
app.run(debug=True)
"""
数据的增删改查
增
articles1 = Article(title='aaa', content='bbb')
db.session.add(articles1)
查
#result = Article.query.filter(Article.title == 'aaa').all() #first() 查询第一条数据,没有数据就
result = Article.query.filter(Article.title == 'aaa').first()
print('title:%s' % result.title)
print('content:%s' % result.content)
改
#先把需要更改的数据查找出来
article1 = Article.query.filter(Article.title == 'aaa').first()
#把这条数据,需要修改的地方进行修改
article1.title = 'new title'
#事条提交
db.session.commit()
删
#先把需要删除的数据查出来
article1 = Article.query.filter(Article.content == 'bbb').first()
#把这条数据删除掉
db.session.delete(article1)
#事务提交
db.session.commit()
"""
app = Flask(__name__)
app.config.from_object(config)
db = SQLAlchemy(app)
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)
db.create_all()
@app.route('/')
def hello_world():
#增加
# articles1 = Article(title='aaa', content='bbb')
# db.session.add(articles1)
# #事物提交
# db.session.commit()
#查
#result = Article.query.filter(Article.title == 'aaa').all() #first() 查询第一条数据,没有数据就
# result = Article.query.filter(Article.title == 'aaa').first()
# print('title:%s' % result.title)
# print('content:%s' % result.content)
#改
#先把需要更改的数据查找出来
# article1 = Article.query.filter(Article.title == 'aaa').first()
# #把这条数据,需要修改的地方进行修改
# article1.title = 'new title'
# #事条提交
# db.session.commit()
#删
#先把需要删除的数据查出来
article1 = Article.query.filter(Article.content == 'bbb').first()
#把这条数据删除掉
db.session.delete(article1)
#事务提交
db.session.commit()
return 'Hello World!'
if __name__ == '__main__':
app.run(debug=True)
"""
外键: 一对多
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 Acricle(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')) #ForeignKey 用的是表名 user,不是模型名User
author = db.relationship('User', backref=db.backref('articles')) #映射,引用表,反向引用表
#relationship给Article这个模型添加一个author属性,可以访问怕个作者的数据,像访问普通模型一样
#backref是定义反射引用,可以通过‘User.articles’这个模型访问这个作者的所有文章
"""
app = Flask(__name__)
app.config.from_object(config)
db = SQLAlchemy(app)
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 Acricle(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')) #ForeignKey 用的是表名 user,不是模型名User
author = db.relationship('User', backref=db.backref('articles')) #映射,引用表,反向引用表
db.create_all()
@app.route('/')
def hello_world():
#想要添加一篇文章,文章依赖用户,所以添加用户
# user1 = User(username='zhiliao')
# db.session.add(user1)
# db.session.commit()
# article = Acricle(title='aaa', content='bbb', atthor_id=2)
# db.session.add(article)
# db.session.commit()
#我要找文章标题为aaa的作者
# artile = Acricle.query.filter(Acricle.title == 'aaa').first()
# author_id = artile.atthor_id
# user = User.query.filter(User.id == author_id).first()
# print("username: %s" % user.username)
# article = Acricle(title='aaa', content='bbb')
# article.author = User.query.filter(User.id == 2).first()
# db.session.add(article)
# db.session.commit()
# 我要找文章标题为aaa的作者
# artile = Acricle.query.filter(Acricle.title == 'aaa').first()
# print('username: %s' % artile.author.username)
#找到用户写过所有的文章
# artile = Acricle(title='222', content='vvv', author_id=2)
# db.session.add(artile)
# db.session.commit()
user = User.query.filter(User.username == 'zhiliao').first()
result = user.articles
for art in result:
print('title: %s' % art.title)
print('content: %s' % art.content)
return 'Hello World!'
if __name__ == '__main__':
app.run(debug=True)
"""
多对多
多对多要通过一个中间表进行关联,中间表不能通过class实现,只能通过db.Table实现
设置关联
tags = db.relationship('Tag', secondary=article_tab, backref=db.backref('articles'))
需要使用一个关键字参数 secondary = 中间表 来进行关联
访问和数据添加可以通过以下方式进行操作
添加数据
article1 = Article(name='aaa')
article2 = Article(name='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.name == 'aaa').first()
tags = article1.tags
for tag in tags:
print(tag.name)
"""
app = Flask(__name__)
app.config.from_object(config)
db = SQLAlchemy(app)
db.create_all()
article_tab = 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)
name = db.Column(db.String(100), nullable=False)
tags = db.relationship('Tag', secondary=article_tab, 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 hello_world():
article1 = Article(name='aaa')
article2 = Article(name='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.name == 'aaa').first()
tags = article1.tags
for tag in tags:
print(tag.name)
return 'Hello World!'
if __name__ == '__main__':
app.run(debug=True)版权声明:本文为weixin_40331132原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。