flask中的数据操作
flask中数据访问:
pip install flask-sqlalemy
创建数据:
创建app的工厂
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_bootstrap import Bootstrap
from flask_nav import Nav
from flask_nav.elements import *
from .views import initApp
boot=Bootstrap()
nav=Nav()
db=SQLAlchemy()
def creteApp():
app = Flask(__name__)
# baseDir = os.path.abspath(os.path.dirname(__file__))
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:434944800@192.168.101.130/test02?charset=utf8'
app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True #该配置为True,则每次请求结束都会自动commit数据库的变动
app.config['SQLALCHEMY_ECHO']=True
nav.register_element('top', Navbar('flask入门',
View('主页', 'index'),
View('关于', 'about')
))
nav.init_app(app)
db.init_app(app)
boot.init_app(app)
initApp(app)
app.config.from_pyfile('config.py')
return app
启动文件Manager.py配置
from flask_script import Manager
from apps.flaskDemo import creteApp
app=creteApp()
manager=Manager(app)
@manager.command
def dev():
from livereload import Server
liveServer=Server(app.wsgi_app)
liveServer.watch('templates/*.*')
liveServer.serve(open_url=True)
@manager.command
def createTable():
from apps.flaskDemo import db
from apps import models
db.create_all()
if __name__ == '__main__':
manager.run()
#app.run(debug=True)
启动应用:
python manager runserver
创建Models:
from .flaskDemo import db
class usersInfo(db.Model):
__tablename__='u_info_2_hello'
id=db.Column(db.Integer,primary_key=True)
username=db.Column(db.String(100),nullable=True)
user_age=db.Column(db.Integer,nullable=True)
email=db.Column(db.String(300),nullable=True)
主外键关系表
class roles(db.Model):
__tablename__='userRoles'
id=db.Column(db.Integer,primary_key=True)
roleName=db.Column(db.String(200),nullable=True)
users=db.relationship('user',backref='myrole') 方向反向查寻
class user(db.Model):
__tablename__='users'
id=db.Column(db.Integer,primary_key=True)
userName=db.Column(db.String(200),nullable=True)
userEmail=db.Column(db.String(200),nullable=True)
roleId=db.Column(db.Integer,db.ForeignKey('userRoles.id')) 与userRoles表的id键关联
多对多关系创建:
tags=db.Table(
'post_tag_mapping',
db.Column('post_id',db.Integer,db.ForeignKey('Post.id')),
db.Column('tag_id',db.Integer,db.ForeignKey('Tag.id'))
)
class Post(db.Model):
__tablename__ = 'Post'
id=db.Column(db.Integer(),primary_key=True)
title=db.Column(db.String(255))
text=db.Column(db.TEXT)
publish_date=db.Column(db.DateTime)
tags=db.relationship(
'Tag',
backref=db.backref('myPost'),
secondary=tags
)
class Tag(db.Model):
__tablename__='Tag'
id=db.Column(db.Integer,primary_key=True)
title=db.Column(db.String(255))
在以上代码中,使用了db.relationsship函数来设置所需的关系,但是这次多了secondary(次级)参数,该参数会告知sqlalchemy该关联的对象被保存在tag所对应的表中,在代码生成的表中,表关系被保存在了post_tag_mapping中
创建表:
python manage.py createTable
数据的CRUD
创建角色表数据
@app.route('/create/')
def createRole():
from .models import roles
from .flaskDemo import db
admin=roles(
roleName='admin1'
)
roles1=roles(
roleName='backupUsers'
)
db.session.add_all([admin,roles1]) 使用db.session.add_all([admin,roles])的方式可以同时创建多个,注意在add_all()方法中的参数是一个列表
return render_template('data/result1.html')
主外键表关系数据的创建
@app.route('/createuser/')
def createUser():
from .models import roles,user
from .flaskDemo import db
role=roles.query.get(3) 获取角色数据
print(type(role))
print(role.roleName)
#外键部分可以实例,也可以写id值
u=user(
userName='test',
userEmail='222@ddd.com',
myrole=role
)
# u = user(
# userName='test',
# userEmail='222@ddd.com',
# roleId=role.id
# )
db.session.add(u)
db.session.commit()
return render_template('data/result1.html')
#数据的查询 ,获取全部数据
@app.route('/queryall/')
def queryallUser():
from .models import roles, user
from .flaskDemo import db
uinfo=user.query.all()
for item in uinfo:
print(item.userName)
return render_template('data/result1.html')
#数据的查询,获取一条数据
@app.route('/queryone/')
def querysingleUser():
from .models import roles, user
from .flaskDemo import db
uinfo = user.query.get(2)
print(uinfo.userName)
return render_template('data/result1.html')
更新与删除:
@app.route('/removeUser/')
def removeUser():
'''
删除数据
:return:
'''
from .models import roles, user
from .flaskDemo import db
u=user.query.get(1)
db.session.delete(u)
db.session.commit()
return render_template('data/result1.html')
@app.route('/updateuinfo/')
def updateUserInfo():
'''
更新数据
:return:
'''
from .models import roles, user
from .flaskDemo import db
u=user.query.get(2)
u.userName='abc'
db.session.add(u)
db.session.commit()
return render_template('data/result1.html')
@app.route('/crosstable/')
def query_crosstable():
'''
查找到角色,并查询下慎于的用户
:return:
'''
from .models import user,roles
r=roles.query.get(2)
u=r.users
for item in u:
print(item.userName)
return render_template('data/result1.html')
一对多正反查询:
@app.route('/u2r/')
def queryDataFromUser2Role():
from .models import user
user01=user.query.first()
role=user01.myrole
print(user01.userName,"=======>role:",role.roleName)
return render_template('data/result1.html')
@app.route('/r2u/')
def queryDataFromRole2User():
from .models import roles
r=roles.query.get(2)
user=r.users
print('roles',r.roleName,"==========>users:",user)
print('user的类型是是========>',type(user))
for item in user:
print(item.userName)
return render_template('data/result1.html')
反向的应用的另一种用法
@app.route('/userrole/')
def createUserRole():
'''
创建用户并添加到对应角色
:return:
'''
from .models import user,roles
from .flaskDemo import db
role1=roles.query.get(1)
u=user(
userName='test',
userEmail='fsfsd'
)
role1.users.append(u)
db.session.add(role1)
db.session.commit()
return render_template('data/result1.html')
限制返回条目:
@app.route('/limituser/')
def limitUser():
'''
限制返回条数
:return:
'''
from .models import user
users=user.query.limit(10).all()
for item in users:
print(item)
return render_template('data/result1.html')
分页:
def pageinate():
from .models import user
u=user.query.paginate(1,10)
print(type(u))
print(u.items)
for item in u.items:
print(item.userName)
#当前页
print(u.page)
#总页
print(u.pages)
#前一页是否有对象可显示
print(u.has_prev)
#后一页是否有数据显示
print(u.has_next)
return render_template('data/result1.html')
多对多的数据操作:
多对多关系数据的写入
@app.route('/createm2m/')
def createm2mRelData():
from .models import Post,Tag
import datetime
from .flaskDemo import db
post_one=Post(
title='鬼吹灯',
text='乎啦啦啦啦啦',
publish_date=datetime.datetime.now()
)
tag_one=Tag(
title='测试'
)
tag_two=Tag(
title='这是一个测试'
)
post_one.tags=[tag_one,tag_two]
db.session.add(post_one)
db.session.commit()
return render_template('data/result1.html')
多对多关系数据的查找
@app.route('/query4m2m/')
def query4m2m():
from .models import Post, Tag
#通过post得到tag
print('通过post====================>tag')
post_data=Post.query.get(1)
#print(dir(post_data))
#print(post_data.tags)
for item in post_data.tags:
print(item.title)
#通过tag得到post
print('通过tag=============>post')
tag_data=Tag.query.get(1)
#print(dir(tag_data))
print(tag_data.title)
for item in tag_data.myPost:
print(item.title)
return render_template('data/result1.html')
多对多关系数据的更新
@app.route('/update4m2m/')
def updateRelform2mData():
'''
更新多对多关系
:return:
'''
from .models import Post,Tag
from .flaskDemo import db
postData=Post.query.get(1)
tagData=Tag.query.all()
print(type(tagData))
postData.tags=tagData
db.session.add(postData)
db.session.commit()
return render_template('data/result1.html')
多对多关系数据的关系删除
@app.route('/removeRel/')
def removeRelform2mData():
''''
移除多对多关系
'''
from .models import Post,Tag
postData=Post.query.get(1)
tagData=Tag.query.get(2)
postData.tags.remove(tagData)
#print(dir(postData.tags))
return render_template('data/result1.html')
出现以下错误的处理方法:
C:\Python34\lib\site-packages\flask_sqlalchemy__init__.py:794: FSADeprecationWarning: SQLALCHEMY_TRACK_MODIFICATIONS adds significant overhead and wil
l be disabled by default in the future. Set it to True or False to suppress this warning.
'SQLALCHEMY_TRACK_MODIFICATIONS adds significant overhead and '
将以下代码
track_modifications = app.config.setdefault(
'SQLALCHEMY_TRACK_MODIFICATIONS', None
)
改为:
track_modifications = app.config.setdefault(
'SQLALCHEMY_TRACK_MODIFICATIONS', True
)
flask中的数据操作的更多相关文章
- 使用Hive或Impala执行SQL语句,对存储在HBase中的数据操作
CSSDesk body { background-color: #2574b0; } /*! zybuluo */ article,aside,details,figcaption,figure,f ...
- 使用Hive或Impala执行SQL语句,对存储在Elasticsearch中的数据操作(二)
CSSDesk body { background-color: #2574b0; } /*! zybuluo */ article,aside,details,figcaption,figure,f ...
- 使用Hive或Impala执行SQL语句,对存储在Elasticsearch中的数据操作
http://www.cnblogs.com/wgp13x/p/4934521.html 内容一样,样式好的版本. 使用Hive或Impala执行SQL语句,对存储在Elasticsearch中的数据 ...
- Python框架学习之Flask中的数据库操作
数据库操作在web开发中扮演着一个很重要的角色,网站中很多重要的信息都需要保存到数据库中.如用户名.密码等等其他信息.Django框架是一个基于MVT思想的框架,也就是说他本身就已经封装了Model类 ...
- Flask中的session操作
一.配置SECRET_KEY 因为flask的session是通过加密之后放到了cookie中.所以有加密就有密钥用于解密,所以,只要用到了flask的session模块就一定要配置“SECRET_K ...
- Flask中请求数据的优雅传递
当一个请求到来时,浏览器会携带很多信息发送发送服务端.在Django中,每一个处理函数都要传入一个request的参数,该参数携带所有请求的信息,也就是服务端程序封装的environ(不明白该参数可以 ...
- Flask 中字典数据返回(jsonify)
不多说,直接上代码,flask中的字典数据的处理: from flask import Flask, jsonify app = Flask(__name__, static_folder=" ...
- Numpy中array数据操作
1.创建: import numpy as np arr=np.array([1,2,3]) print(arr,arr.ndim) list=[1,2,3] arr=np.array(list) 2 ...
- flask中使用SQLAlchemy操作mysql的一些注意事项和坑
一 ImportError: cannot import name 'db' 由于app最后才加载,所以其他文件,比如models.py不能从app.py导入任何变量, 要使用db可以先定义一个,之后 ...
随机推荐
- openstack 的 lbaas 疑问
1 为什么lbaas的haproxy实现没有将其放到vrouter中,而vpnaas/fwaas都放到vrouter中呢? 放在vrouter上,可以减少vrouter到haproxy的流量路径,是怕 ...
- python--类与类之间的关系,(魔术方法)特殊成员方法
1.依赖关系 类与类之间存在这几种关系:1.依赖关系 2.关联关系 3.组合关系 4.聚合关系 5.继承关系 6.实现关系 我们来设置下面两个场景 玩电脑和打僵尸 class Person: def ...
- 201621123023《Java程序设计》第14周学习总结
一.本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结与数据库相关内容. 使用数据库技术改造你的系统 2.1 简述如何使用数据库技术改造你的系统.要建立什么表?截图你的表设计. 由于我的系 ...
- Java学习笔记XML(3)
XML简介 XML即可扩展的标记语言.因此该语言中所有的标签都是没有预先定义的,开发者可以自己随意的指定. 目前为止所有的标记的语言都属于开源的语言.由W3C组织进行一个基本的维护. 因此大家学习这些 ...
- WEB新手之布尔盲注
开始写SQL的题,单引号等特殊符号闭合漏洞比较简单,因此从Less-5开始写. 布尔盲注是多种盲注的一种,这种盲注方法也比较好理解.但使用这种盲注有一个前提,就是网页会有回显,透过这个回显,我们可以通 ...
- [bzoj3995] [SDOI2015]道路修建 线段树
Description 某国有2N个城市,这2N个城市构成了一个2行N列的方格网.现在该国政府有一个旅游发展计划,这个计划需要选定L.R两列(L<=R),修建若干条专用道路,使得这两列之间(包括 ...
- 如何学习sql语言?
如何学习 SQL 语言? https://www.zhihu.com/question/19552975 没有任何基础的人怎么学SQL? https://www.zhihu.com/question/ ...
- 指针版P3690 【模板】Link Cut Tree (动态树)
题面 传送门 题解 鉴于数组版实在是太慢我用指针版重新写了一遍 代码基本是借鉴了lxl某道关于\(LCT\)的题 //minamoto #include<bits/stdc++.h> #d ...
- HDU-1260-Tickets(线性DP,DP入门)
Tickets Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Su ...
- iOS开发debug跟release版本NSLog屏蔽方法
简单介绍以下几个宏: 1) __VA_ARGS__ 是一个可变参数的宏,这个可变参数的宏是新的C99规范中新增的,目前似乎只有gcc支持(VC6.0的编译器不支持).宏前面加上##的作用在于,当可变参 ...