Flask+Orm——使用SQLAlchemy来操作数据库

使用到的库 

from flask import Flask
from sqlalchemy import Column, String, create_engine, INTEGER
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base
import json

数据库连接

#编码格式使用UTF-8,不然会中文乱码,查看数据库编码格式也要是UTF-8
engine = create_engine('mysql+pymysql://root:123@localhost:3306/qunaer', encoding='UTF-8', echo=True)  # 数据库连接引擎

"""
engine = create_engine('dialect+driver://username:password@host:port/database')
dialect -- 数据库类型
driver -- 数据库驱动选择
username -- 数据库用户名
password -- 用户密码
host 服务器地址
port 端口
database 数据库
"""

使用ORM来操作数据库,首先需要创建一个类来与对应的表进行映射。

现在以User表来做为例子,它有自增长的idname 两个字段,那么对应的类为:

class User(Base):  # 定义User对象:
    __tablename__ = 'user'  # 表的名字
    # 表的结构:
    id = Column(INTEGER, primary_key=True, autoincrement=True)  # int类型, 主键,自增
    name = Column(String(20))
    def obj_to_dict(self):   # 返回json格式定义
        return {
            "id": self.id,
            "name": self.name
        }

将类映射到数据库中:

把创建的数据插入到数据库中。和数据库打交道的,是一个叫做Session的对象: 

class db_Session:
    def __init__(self):
        self.DBSession = sessionmaker(bind=engine)  # 创建DBSession类型:
        self.session = self.DBSession()  # 创建session对象

现在只是把数据添加到session中,但是并没有真正的把数据存储到数据库中。如果需要把数据存储到数据库中,还要做一次commit操作:

@app.route('/addUser')
def add_user():
    db = db_Session()
    new_user = User(name='xioalei')
    db.session.add(new_user)   # 添加到session, 插入数据
    db.session.commit()
    # db.session.refresh(new_user)
    db.session.close()  # 关闭session:
    return 'success'

SQLAlchemyORM实现中,在做commit操作之前,所有的操作都是在事务中进行的,因此如果要将事务中的操作真正的映射到数据库中,还需要做commit操作。

如何进行查找操作:

查找操作是通过session.query()方法实现的,这个方法会返回一个Query对象,Query对象相当于一个数组,装载了查找出来的数据,并且可以进行迭代。具体里面装的什么数据,就要看向session.query()方法传的什么参数了,如果只是传一个ORM的类名作为参数,那么提取出来的数据就是都是这个类的实例,比如:

@app.route('/getUsers')
def get_users():
    db = db_Session()  #获取数据执行会话
    result = db.session.query(User).filter(User.id >= 1)  # 返回一个对象列表
    #db.session.query(User).filter(User.name == "llj").delete()
    #db.session.query(User).filter(User.name == "xioalei").delete()
    db.session.commit()
    db.session.close()  # 关闭session:
    return json.dumps(dict_helper(result), ensure_ascii=False)   # 返回json格式数据

如果想对结果进行过滤,可以使用filter_byfilter两个方法,这两个方法都是用来做过滤的,区别在于,filter_by是传入关键字参数,filter是传入条件判断,并且filter能够传入的条件更多更灵活

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值