web框架-tornado操作数据库

一、使用torndb模块链接mysql数据库

1. 下载 pymysql模块

pip install pymysql==0.9.3
torndb 模块链接mysql数据库:torndb 中封装了MySQLDB,但是MySQLDB不能使用了。需要依赖于pymysql。

2. 下载torndb

pip install torndb

3. 链接mysql数据库
import torndb

# 1.连接数据库
db = torndb.Connection(
    host='127.0.0.1',
    database='tn01',
    user='root',
    password='root'
)

# 2.简单查询
result = db.query('select * from person')
print(result)

# 3.关闭连接
db.close()
)

注意:在运行时会出错,修改源代码
(1)报错:torndb模块默认依赖MySQLdb模块


错误1.png

解决方案:将源代码中的所有MySQLdb换成pymysql
(2)修改链接超时时间


修改2.png

(3)将 “+” 修改为 append()
修改3.png

修改为:
修改结果.png

(4)将 izip 修改为 zip_longest


修改前.png

修改后.png

修改成功后运行结果展示:
结果截图.png
4. 结合tornado使用
import tornado.ioloop
import tornado.web
import torndb


class IndexDemo(tornado.web.RequestHandler):

    def initialize(self):
        # 连接数据库
        self.db = torndb.Connection(host='127.0.0.1', database='tn01', user='root', password='root')

    def get(self):
        result = self.db.query('select * from person')
        print(result)
        self.write('ok')

    def on_finish(self):
        self.db.close()


if __name__ == '__main__':
    app = tornado.web.Application(
        [
            ('/index/', IndexDemo),
        ],
        template_path='templates',   # 指定盛放模板文件的目录
        static_path='static',    # 告诉tornado 静态目录
        static_url_prefix='/static/'   # 浏览器访问时的url
    )
    app.listen(8888)
    tornado.ioloop.IOLoop.current().start()

二、使用SQLAlchemy操作数据库

上面的方法可以实现数据库操作,但是有些复杂,不如ORM使用方便,使用SQLAlchemy模块可以使用ORM进行数据操作。

1. 安装SQLAlchemy 模块

pip install SQLAlchemy

2. 使用sqlalchemy创建数据库表格
import os
import sqlalchemy
# 进行表和核心关联的方法
from sqlalchemy.ext.declarative import declarative_base

# 1.连接数据库
BASE_DIR = os.path.abspath(os.path.dirname(__file__))
path = 'sqlite:///' + os.path.join(BASE_DIR, 'db.sqlite3')

# 2.创建数据库连接核心,负责连接数据库
engine = sqlalchemy.create_engine(path,   # 数据库的配置
                                  encoding='utf-8',   # 数据库的编码
                                  echo=True   # 保持输出
                                  )

# 3.创建基类
Base = declarative_base(bind=engine)

# 4.创建模型类,继承基类
class Car(Base):
    __tablename__ = 'car'
    id = sqlalchemy.Column(sqlalchemy.Integer, primary_key=True, autoincrement=True)
    c_name = sqlalchemy.Column(sqlalchemy.String(32))
    c_price = sqlalchemy.Column(sqlalchemy.Integer)


# 5.创建表格
if __name__ == '__main__':
    Base.metadata.create_all()
5.代码封装
封装代码.png

(1)settings.py

# 配置文件
import os

# 数据库配置
BASE_DIR = os.path.abspath(os.path.dirname(__file__))
path = "sqlite:///" + os.path.join(BASE_DIR, 'tn.sqlite3')

# tornado参数配置
tornado_config = {
    'template_path': 'templates',
    'static_path': 'static',
    'static_url_prefix': '/static/',
    'debug': True
}

(2)models.py

# 数据库
import sqlalchemy
from settings import path
# 表和核心关联的方法
from sqlalchemy.ext.declarative import declarative_base
# 创建查询对象
from sqlalchemy.orm import sessionmaker


# 创建数据库核心,连接数据库
engine = sqlalchemy.create_engine(path, encoding='utf8', echo=True)
# 创建基类
Base = declarative_base(bind=engine)
# 创建数据库执行的类
Session = sessionmaker(bind=engine)
# 实例化数据库的游标
session = Session()


# 封装
class BaseModel(Base):
    __abstract__ = True
    id = sqlalchemy.Column(sqlalchemy.Integer, primary_key=True, autoincrement=True)

    def save(self):
        session.add(self)
        session.commit()

    def delete(self):
        session.delete(self)
        session.commit()

    def update(self):
        session.commit()


class Car(BaseModel):
    __tablename__ = 'car'
    c_name = sqlalchemy.Column(sqlalchemy.String(32))
    c_price = sqlalchemy.Column(sqlalchemy.Integer)

(3)views.py

import tornado.web
from models import Car


class IndexHandler(tornado.web.RequestHandler):

    def get(self):
        car_obj = Car(c_name='五菱宏光', c_price=50000)
        car_obj.save()
        self.render('index.html')

(4)urls.py

from views import *

urlpatterns = [
    (r"/index/", IndexHandler)
]

(5)app.py

# 创建application 对象
import tornado.web
from urls import urlpatterns
from settings import tornado_config


def make_app():
    app = tornado.web.Application(
        urlpatterns,
        # 解析字典:配置信息
        **tornado_config
    )

    return app

(6)manage.py

# 启动项目
import tornado.ioloop
from app import make_app
from models import Base


if __name__ == '__main__':
    # 1.创建数据库
    Base.metadata.create_all()
    # 2.监听端口号
    app = make_app()
    app.listen(8888)
    # 3.启动项目
    tornado.ioloop.IOLoop.current().start()
插入数据、查询数据举例.png
3. 前端请求数据处理
class Index1Handler(tornado.web.RequestHandler):

    def get(self):
        # http请求方法
        print(self.request.method)
        # 客户请求的uri地址
        print(self.request.uri)
        # 完整的url
        print(self.request.full_url)
        # uri当中的路径
        print(self.request.path)
        # http版本
        print(self.request.version)
        # http headers请求头字典格式
        print(self.request.headers)
        # http请求的内容,字符串格式
        print(self.request.body)
        # 客户端ip
        print(self.request.remote_ip)
        # 请求的协议 http/https
        print(self.request.protocol)
        # 请求的主机
        print(self.request.host)
        # 客户端提交的参数
        print(self.request.arguments)
        # 客户端请求的文件
        print(self.request.files)
        self.write('请求')
部分请求结果截取.png
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容