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可以先定义一个,之后 ...
 
随机推荐
- Syncthing源码解析 - 在Gogland中对Syncthing的各个模块进行调试?
			
Syncthing的模块很多,各自负责不同的功能,如何能够对各个模块进行调试?Syncthing开发者早就想到这个问题了,允许开发者对任意模块进行单独调试,也允许同时对所有模块调试,调试方式是打印各个 ...
 - 【12c OCP】CUUG OCP认证071考试原题解析(34)
			
34.choose two View the Exhibit and examine the structure of the PRODUCT_INFORMATION and INVENTORIES ...
 - 点击input消除默认背景颜色:focus
			
1.在谷歌浏览器会出现默认点击input框黄色背景,如何去除? //消除google浏览器黄色框 input:-webkit-autofill, input:-webkit-autofill:hove ...
 - 常用类(日期时间格式转换,date,枚举)
			
1 常用类 1.1 日期时间类 计算机如何表示时间? 时间戳(timestamp):距离特定时间的时间间隔. 计算机时间戳是指距离历元(1970-01-01 00:00:00:000)的时间间隔(ms ...
 - 根据IP获取IP定位
			
http://ip.taobao.com/service/getIpInfo.php?ip=27.17.60.152 {,"}} 不确定是否有次数限制
 - 为解决Samba   windows 无法访问 尝试过的方法
			
1, 通过 vi /etc/sysconfig/selinux 把 SELINUX=enforcing 修改为SELINUX= disable 退出保存,并且重启.(设置了) 2, 把wind ...
 - Linux 开机过程(转)
			
Linux 开机过程 初始化 POST(加电自检)并执行硬件检查: 当 POST 完成后,系统的控制权将移交给启动管理器的第一阶段(first stage),它存储在一个硬盘的引导扇区(对于使用 BI ...
 - Myeclipse设置自动联想功能
			
///声明,博客园暂无转载功能,这篇博客是转载自贞心真义. 最近初学Java,正在使用MyEclipse来编写新的项目,刚开始打开MyEclipse感觉这个工具既陌生又熟悉,熟悉之处在于编辑器的几大共 ...
 - FlowPortal-BPM——数据库交互:创建新接口(类库)—将数据提交给其他程序使用
			
使用到的是“流程设计”→“自定义插件” 一.创建新类库 (1)新建类库→引用文件 (2)新建ado.net数据访问类(要操作的数据库) (3)右键类库名称→属性→生成→输出→路径:安装目录下UserD ...
 - 利用CompletableFuture优化程序的执行效率
			
一.线程池的Future模式 在了解java8的CompletableFuture之前,先通过Future来解决一个问题,看个例子: 假设现在有一个网站,首页有顶部Banner位.左边栏.右边栏.用户 ...