Tornado数据库与接口

一、Tornado数据库的操作
  • tornado

    torndb是torndb携带的一个数据库操作工具,但是对python3的支持还是有问题,我们

    在这里做了一个简单了解

二、torndb使用
  • 安装torndb

    pip install torndb

  • 安装pymysql

    pip install pymysql

  • 修改源代码:

    在虚拟环境site- packages包打开torndb.py模块文件

    Ctrl+r 将所有的MySQLdb 改成pymsyql

    Ctrl+f 搜索源代码修改

    # return [Row(itertools.izip(column_names, row)) for row in cursor]
    return [Row(itertools.zip_longest(column_names, row)) for row in cursor]
    
    # CONVERSIONS[field_type] = [(FLAG.BINARY, str)] + CONVERSIONS[field_type]
    CONVERSIONS[field_type] = [(FLAG.BINARY, str)].append(CONVERSIONS[field_type])
    
    # max_idle_time=7 * 3600, connect_timeout=0,
    max_idle_time=7 * 3600, connect_timeout=10,
    
  • 使用torndb

    """
    使用torndb完成数据库数据的操作
    1、连接
    2、执行sql
    3、关闭
    """
    
    # 导入包
    import torndb
    
    # 连接
    my_conn = torndb.Connection(
        host="127.0.0.1", database="dailyfresh", user="root", password="root"
    )
    
    # 执行sql-查询一条数据
    result = my_conn.get("select * from goods where id=1")
    print(result)
    
    # 执行sql-查询多条数据
    results = my_conn.query("select * from goods where id<10")
    print(results)
    
    # 关闭
    my_conn.close()
    
三、Tornado SQLAlchemy

上面的方法可以实现数据库操作,但是有些复杂,类似于PyMySQL模块操作,不如ORM使用方便,那

么下面来开以下 Tornado ORM操作

  • 安装sqlalchemy

    pip install sqlalchemy

  • 安装pymysql

    pip install pymysql

  • 创建数据库测试

    # 导入包
    from sqlalchemy import create_engine, Column, String, Integer, Float, Date
    from sqlalchemy.ext.declarative import declarative_base
    import pymysql
    import os
    
    # mysqldb和pymysql版本
    pymysql.install_as_MySQLdb()
    
    # 项目的路径
    base_dir = os.path.dirname(__file__)
    # sqlite的路径
    db_path = "sqlite:///" + os.path.join(base_dir, "db.sqlite")
    
    # 创建核心对象engine
    engine = create_engine(
        db_path,  # 数据库的路径
        encoding="utf-8",  # 编码格式
        echo=True,  # 将sql语句显示到控制台
    )
    
    # 创建实体类的基类
    Base = declarative_base(engine)
    
    
    # 实体类
    class Car(Base):
        """实体类-汽车"""
        __tablename__ = "car"  # 数据库表名
        id = Column(Integer, primary_key=True, autoincrement=True)  # 主键id
        name = Column(String(64))  # 车型号名称
        nowprice = Column(Float)  # 现在的价格(万)
        oldprice = Column(Float)  # 原来的价格(万)
        km = Column(Float)  # 公里数(万)
        city = Column(String(64))  # 车辆所在城市
        buydate = Column(Date)  # 车辆购买时间
        year = Column(Integer)  # 保修年数
        day = Column(Integer)  # 可退天数
    
    
    if __name__ == '__main__':
        # 删除表,创建表
        # Base.metadata.drop_all()
        Base.metadata.create_all()
    
    
  • 封装

    class BaseMode(Base):
        """实体类-包装基类"""
    
        __abstract__ = True  # 抽象类,不会转成表
        id = Column(Integer, primary_key=True, autoincrement=True)  # 主键id
    
        def save(self):
            """新增"""
            session = Session()
            session.add(self)
            session.commit()
            session.close()
    
        def delete(self):
            """删除"""
            session = Session()
            session.delete(self)
            session.commit()
            session.close()
    
        def update(self):
            """更新"""
            session = Session()
            session.add(self)
            session.commit()
            session.close()
    
  • 增删改查

    def insert2():
        # 创建对象
        car = Car(name="奔驰S320", nowprice=22.2, oldprice=25.5, km=8.5, city="广州市",
                  buydate=datetime.strptime("2015-2-10", "%Y-%m-%d"), year=2, day=30)
        # 新增
        car.save()
    
    
    def delete():
        """删除"""
    
        # 1、删除
        session = Session()
        car = session.query(Car).get(1)
        print(car)
        session.close()
    
        # 2、删除
        car.delete()
    
    
    def update():
        """修改"""
    
        # 1、查询
        session = Session()
        car = session.query(Car).get(1)
        session.close()
    
        # 2、修改
        print(car.name)
        car.name = "xxx"
        car.update()
    
    
    def select():
        """查询"""
    
        session = Session()
    
        # 1、查询单个
        car = session.query(Car).get(1)
        print(car)
    
        car_list = session.query(Car).filter(Car.name.like("%宝马%"))
        # query对象,打印,转成str,就是对应的sql语句
        print(car_list, type(car_list))
    
        # 2、查询含有宝马的
        car_list = session.query(Car).filter(Car.name.like("%宝马%")).all()
        print(car_list)
    
        # 3、查询含有宝马的总价格
        ret = session.query(Car, func.sum(Car.nowprice)).filter(Car.name.like("%宝马%")).all()
        print(ret)
    
        ret = session.query(Car).filter(Car.name.like("%宝马%")).with_entities(func.sum(Car.nowprice)).all()
        print(ret)
    
        session.close()
    
四、基于ORM的结构修改成模块化

随着ORM的加入,项目代码越发的复杂,需要尝试进行项目的结构调整了

app.py是整个项目的起始,负责创建数据库引擎和服务

manage.py 是控制启动文件

models.py 是数据库模型文件

settings.py是配置文件

urls.py是路由文件

views.py 是视图文件

五、Tornado表单操作
  • Tornado请求管理

    和Django,Flask一样,Tornado也有对前端请求数据进行处理的方法

    属性名说明
    methodhttp请求方法
    url客户请求的完整uri地址
    pathUrl当中的路径
    versionhttp版本
    headershttp headers 字典格式
    bodyhttp请求内容部分 字符串格式
    remote_ip客户端ip
    protocol请求的协议 http/https
    host请求的主机
    arguments客户端提交的参数
    files客户端上传的文件
  • 总结

1、普通表单数据,

获取方式:

self.get_argument("name") # 单个值
self.get_arguments("hobby") # 集合

2、非表单,json格式的字符串做为请求体发来的数据#获取发来的json格式的字符串,非普通表单数据

import json

#获取

data_str = self.request.body.decode("utf-8")

#转字典

data_dict = json.loads(data_str)
Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐