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:[email protected]/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='[email protected]',
      myrole=role
  )
  # u = user(
  #     userName='test',
  #     userEmail='[email protected]',
  #     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 will 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
)

 

猜你喜欢

转载自www.cnblogs.com/lijintian/p/9050097.html