Flask 使用Flask-SQLAlchemy操纵数据库

打印 上一主题 下一主题

主题 1670|帖子 1670|积分 5010

username = db.Column(db.String(64), unique=True, index=True);
  password = db.Column(db.String(64));
  建立对应关系

  如果是多对多关系就建一张表,关联两个表的id

  role_id = db.Column(db.Integer, db.ForeignKey(‘roles.id’))
  ‘’’
  帮助作关联查询
  relationship()把两个表关联在一起,不添加也是可以的,根据自己的需求
  backref : 在关系的另一模型中添加反向引用
  相当于给要关联的表添加一个role属性
  不添加也是可以的,根据自己的需求
  ‘’’
  rol = db.relationship(‘Role’, backref=‘use’)
  db.Column类构造函数的第一个参数是数据库列和模型属性的类型。如下表是一些常用的列类型
  | 类型名 | 说明 |
  | — | — |
  | Integer | 普通整数,一般是32位 |
  | SmallInteger | 取值范围小的整数,一般是16位 |
  | Float | 浮点数 |
  | Numeric | 定点数 |
  | String | 字符串 |
  | Text | 文本字符串 |
  | Boolean | 布尔值 |
  | Date | 日期 |
  | Time | 时间 |
  | DateTime | 日期和时间 |
  db.Column中别的的参数指定属性的配置选项,如下是一些可用的选项
  | 选项名 | 说明 |
  | — | — |
  | primary_key | 如果设为True,这列就是表的主键 |
  | unique | 如果设为True,唯一索引 |
  | index | 如果设为True,为这列创建索引 |
  | nullable | 如果设为True,答应为空值 |
  | default | 为这列定义默认值 |
  | autoincrement | 如果设为True,主动递增 |
  常用的关系配置选项
  | 选项名 | 说明 |
  | — | — |
  | backref | 在关系的另一个模型中添加反向引用 |
  | order_by | 指定关系中记录的排序方式 |
  | secondary | 指定多对多关系中关系表的名字 |
  操纵数据库

  创建和删除表

  表的模型创建好后,可以使用db.create_all()函数根据模型在数据库中创建对应的表。
  根据类创建表

  db.create_all()
  删除全部表

  db.drop_all()
  增删改查

  添加
  创建两个添加数据的视图函数,一次可以添加一条或多条数据。
  新增一条数据

  @app.route(‘/add’)
  def createOne():
  构造模型,使用关键字参数指定的模型属性初始值

  role = Role(name = “管理员1”);
  把预备写入数据库的对象,先添加到会话中

  db.session.add(role);
  调用commit()方法提交会话,保存

  db.session.commit();
  return “添加成功!”;
  添加多条数据

  @app.route(“/adds”)
  def createAll():
  role = Role(name = “管理员2”);
  roles = [
  Role(name=“管理员3”),
  Role(name=“管理员4”),
  Role(name=“管理员5”)
  ]
  db.session.add_all(roles);
  db.session.add(role);
  db.session.commit();
  return “添加成功”
  访问上述两个视图函数后,数据库中添加了对应的数据,如下所示:
  

  上面给roles表中添加了五条数据,下面这个视图函数给users表添加一条数据,关联roles表。
  添加用户表数据

  @app.route(“/addUser”)
  def addUser():
  user = User(username = “admin1”, password=“admin”, role_id=6)
  db.session.add(user);
  db.session.commit();
  return “添加成功”
  上面视图函数中是直接给出的roles表中的id值的,开发中可以根据某一属性查询出roles某一条数据举行关联。访问视图函数后,效果如下:
  

  查询全部结果
  定义一个视图查询出roles表中的全部数据。
  查询表中全部数据

  @app.route(“/findAll”)
  def findAll():
  返回一个列表,all()函数返回全部结果

  result = Role.query.all();
  print(result)
  for item in result:
  print(item.id, item.name)
  return “查询成功”
  查询结果如下:
  

  上述中查询使用了all()函数,返回查询的全部结果,下表是SQLAlchemy查询一些常用的函数。
  | 方法 | 说明 |
  | — | — |
  | all() | 以列表形式返回查询的全部结果 |
  | first() | 返回查询的第一个结果,如果没有结结果,则返回None |
  | frist_or_404 | 返回查询的第一个结果,如果没有结果,则重则哀求,返回404错误相应 |
  | get() | 返回指定主键对应的行,如果没有对应的行,则返回None |
  | get_or_404 | 返回指定主键对应的行,如果没找到指定的主键,则终止哀求,返回404错误相应 |
  | count() | 返回查询结果的数目 |
  | paginate() | 返回一个Paginate对象,它包含指定范围内的结果 |
  根据条件查询
  在上述查询全部数据中,使用filter举行条件查询
  如下视图函数根据username属性查询。
  根据用户名查询数据

  @app.route(“/findByUsername/”)
  def findByUsername(username):
  filter过滤器,根据条件查询

  obj = User.query.filter(User.username == username).all();
  print(obj);
  return “查询成功”;
  在SQLAlchemy中除了filter过滤器还有一些其他的查询过滤器。如下
  | 过滤器 | 说明 |
  | — | — |
  | filter() | 把过滤器添加到原查询上,返回一个新查询 |
  | filter_by() | 把等值过滤器添加到原查询上,返回一个新查询 |
  | limit() | 使用指定的值限制原查询返回的结果数目,返回一个新查询 |
  | offset() | 偏移原查询返回的结果,返回一个新查询 |
  | order_by() | 根据指定条件对原查询结果举行排序,返回一个新查询 |
  | group_by() | 根据指定条件对原查询结果举行分组,返回一个新查询 |
  删除
  先根据id查询出需要参数的数据,在使用delete举行删除。
  根据条件删除

  @app.route(“/deleteById/”)
  def deleteById(id):
  根据id查询数据,filter条件查询

  role = Role.query.filter(Role.id == id).first();
  db.session.delete(role);
  db.session.commit();
  return “删除成功”;
  修改
  查询出表中的第一条数据,对其name属性举行修改,之后在保存。
  修改

  @app.route(“/update”)
  def update():
  role = Role.query.first();
  role.name = “体系管理员”;
  db.session.commit();
  return “修改成功”
  上述案例完整代码如下:
  from flask import Flask
  from flask_sqlalchemy import SQLAlchemy
  app = Flask(name)
  配置链接数据库信息

  mysql://账号:密码@链接地点:端口/数据库名

  app.config[‘SQLALCHEMY_DATABASE_URI’] = “mysql+pymysql://root:root@localhost:3306/flaskdemo”
  设置是否跟踪数据库的修改环境

  app.config[‘SQLALCHEMY_TRACK_MODIFICATIONS’] = True
  数据库操纵时是否表现原始SQL语句,日志

  app.config[‘SQLALCHEMY_ECHO’] = True
  链接超时时间

  app.config[‘SQLALCHEMY_POOL_TIMEOUT’] = 3000
  实例SQLAlchemy类,use_native_unicode='utf8’设置编码,必须设置

  db = SQLAlchemy(app, use_native_unicode=‘utf8’);
  @app.route(‘/’)
  def hello_world():
  return ‘Hello World!’
  定义Role和User两个类

  class Role(db.Model):
  定义表名

  tablename = ‘roles’;
  db.Column定义属性,db.Integer设置类型,

  Primary_key = True设置主键

  unique = True设置唯一索引

  index = True创建索引,提示查询服从

  nullable = True答应为空值

  default为这列设置默认值

  autoincrement = True主动递增

  id = db.Column(db.Integer, primary_key=True, autoincrement=True)
  name = db.Column(db.String(64), nullable=False)
  定义一个User类

  class User(db.Model):
  tablename = ‘users’;
  id = db.Column(db.Integer, primary_key=True, autoincrement=True);
  username = db.Column(db.String(64), unique=True, index=True);
  password = db.Column(db.String(64));
  这一列的值为roles表中的id值

  如果是多对多关系就建一张表,关联两个表的id

  role_id = db.Column(db.Integer, db.ForeignKey(‘roles.id’))
  ‘’’
  帮助作关联查询
  relationship()把两个表关联在一起,不添加也是可以的,根据自己的需求
  backref : 在关系的另一模型中添加反向引用
  相当于给要关联的表添加一个role属性
  不添加也是可以的,根据自己的需求
  ‘’’
  rol = db.relationship(‘Role’, backref=‘use’)
  新增一条数据

  @app.route(‘/add’)
  def createOne():
  构造模型,使用关键字参数指定的模型属性初始值

  role = Role(name = “管理员1”);
  把预备写入数据库的对象,先添加到会话中

  db.session.add(role);
  调用commit()方法提交会话

  db.session.commit();
  return “添加成功!”;
  添加多条数据

  @app.route(“/adds”)
  def createAll():
  role = Role(name = “管理员2”);
  roles = [
  Role(name=“管理员3”),
  Role(name=“管理员4”),
  Role(name=“管理员5”)
  ]
  db.session.add_all(roles);
  db.session.add(role);
  db.session.commit();
  return “添加成功”
  查询表中全部数据

  @app.route(“/findAll”)
  def findAll():
  返回一个列表

  result = Role.query.all();
  print(result)
  for item in result:
  print(item.id, item.name)
  return “查询成功”
  根据条件删除

  @app.route(“/deleteById/”)
  def deleteById(id):
  根据id查询数据,filter条件查询

  role = Role.query.filter(Role.id == id).first();
  db.session.delete(role);
  db.session.commit();
  return “删除成功”;
  修改

  @app.route(“/update”)
  def update():
  role = Role.query.first();
  role.name = “体系管理员”;
  db.session.commit();
  return “修改成功”
  添加用户表数据

  @app.route(“/addUser”)
  def addUser():
  user = User(username = “admin1”, password=“admin”, role_id=6)
  db.session.add(user);
  db.session.commit();
  return “添加成功”
  根据用户名查询数据

  @app.route(“/findByUsername/”)
  def findByUsername(username):
  obj = User.query.filter(User.username == username).all();
  print(obj);
  return “查询成功”;
  查询全部用户,不表现权限

  @app.route(“/findUserAll”)
  def findUserAll():
  objs = User.query.all()
  for obj in objs:
  print(obj.id, obj.username, obj.password, obj.role_id);
  return “查询成功”
  查询全部用户,表现权限

  @app.route(“/findUserAll1”)
  def findUserAll1():
  objs = User.query.all()
  for obj in objs:
  通过类中的relationship调用关联类的属性

  print(obj.id, obj.username, obj.password, obj.rol.name);

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! 更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
继续阅读请点击广告

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

缠丝猫

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表