tornado与数据库mysql交互
概述:tornado 没有自带的ORM,对于数据库需要自己去适配,并且目前python3.6 +tornado还没有比较完善的驱动,PyMySQL支持python3.x,而MySQLdb不支持python3.x
hlx2@NLP:~$ mysql -uroot -p
-p就是-password的意思,然后后面有东西代表密码为空,-u表示-username,后面加了root表示username为root。
mysql>CREATE DATABASE tornado_mysql;
mysql> use tornado_mysql;
22.建立连接
1. 用Navicat连接数据库后,简单的创建一个表,
注意:设置主键为id,和自动递增
注意:新建连接时可能出现:
1130-host … is not allowed to connect to this MySql server错误
解决:https://blog.csdn.net/weixin_43097301/article/details/85892582
1251 Client does not support authenticasider upgrading Mysotocol requested by ser错误
解决:https://blog.csdn.net/weixin_43097301/article/details/85892142
2. 在config中配置数据库
相应的修改为自己的信息
- #数据库配置
- mysql ={
- "host":"192.168.3.36",
- "user":"root",
- "passwd":"123456",
- "dbname":"tornado_mysql"
- }
- 新建zjMuSQL.py在根目录,即和config同级
- import pymysql #导入pymysql,因为PyMySQL支持python3.x,而MySQLdb不支持python3.x
-
- class zjMySQL():
- def __init__(self,host,user,passwd,dbName):
- self.host = host #登录主机
- self.user = user #用户
- self.passwd = passwd #密码
- self.dbName = dbName #数据库的名,新建的数据库名
-
- def connet(self): #用于连接数据库
- self.db=pymysql.connect(self.host,self.user,self.passwd,self.dbName)
- self.cursor=self.db.cursor()
-
- def close(self): #用于断开连接
- self.cursor.close()
- self.db.close()
-
- def get_one(self,sql): #查询一条数据;类型为元组
- res=None #sql参数为查询mysql语句
- try:
- self.connet()
- self.cursor.execute(sql) #执行查询
- res=self.cursor.fetchone() #获取数据
- self.close() #关闭
- except:
- print("查询失败")
-
- return res
-
- def get_all(self,sql): #获取所有;类型为元组
- res = () #sql参数为查询mysql语句
- try:
- self.connet() #连接数据库
- self.cursor.execute(sql) #执行查询语句
- res=self.cursor.fetchall() #接收全部的返回结果行
- self.close()
- except:
- print("查询失败")
- return res
-
- def get_all_obj(self,sql,tableName,*args): #获取所有;类型为列表
- resList = [] #sql:sql查询语句
- fieldsList=[]
- if(len(args)>0):
- for item in args: #遍历字典key
- fieldsList.append(item) #添加kry
- else:
- fieldsSql="select COLUMN_NAME from information_schema.COLUMNS where table_name ='%s'and table_schema = '%s'"%(tableName,self.dbName)
- #column name列名 information sheet: 信息表
- fields=self.get_all(fieldsSql) #执行语句,获取所有表信息(("id,"),("name",),("age,"))
- for item in fields: #遍历key
- fieldsList.append(item[0]) #添加
-
- res=self.get_all(sql) #获取传参的查询语句的数据,元组类型tuple
- for item in res:
- items= item
- obj = {}
- count = 0
- for x in item:
- obj[fieldsList[count]]=x
- count += 1
- resList.append(obj)
- return resList
-
- def insert(self,sql): #插入
- return self.__edit(sql)
- def update(self,sql): #修改
- return self.__edit(sql)
- def delete(self,sql): #删除
- return self.__edit(sql)
- def __edit(self,sql):
- count = 0
- try:
- self.connet()
- count = self.cursor.execute(sql)
- self.db.commit()
- self.close()
- except:
- print("事务提交失败")
- self.db.rollback()
- return count
4. 在application中最后配置url
省略了路由的handlers=[ ]中的部分代码
注意,路由要放在静态路由((r”/(.*)$”,tornado.web.StaticFileHandler,{“path”:os.path.join(config.BASE_DIRS,“static/html”),“default_filename”:“index.html”}),)之前,不然访问路由会报错
- from zjMySQL import zjMySQL
- handlers=[
- r"/students",index.StudentsHandler),
- ]
-
-
- self.db = zjMySQL(config.mysql["host"],config.mysql["user"],config.mysql["passwd"],config.mysql["dbname"]) #实例化一个ziMySQL的对象db设置连接,访问数据库,方便调用
5. 获取数据
views/index中
- class StudentsHandler(RequestHandler): #数据库中获取信息,并展示
- def get(self, *args, **kwargs):
- # stus = self.application.db.get_all_obj("select name,age from students", "students", "name", "age") #查询指定字段
- # 获取数据
- stus=self.application.db.get_all_obj("select * from students","students") #查询获取数据
- print(stus)
- self.write("ok")
- # self.render("students.html",stus=stus)
#(pycharm输出):
[{‘id’: 1, ‘name’: ‘小白’, ‘age’: 18}, {‘id’: 2, ‘name’: ‘老王’, ‘age’: 20}]
#表明拿到了数据库的数据
6. 插入数据
views/index中
- class StudentsHandler(RequestHandler): #数据库中获取信息,并展示
- def get(self, *args, **kwargs):
- self.application.db.insert("insert into students (name,age) values('小李',22);") #插入语句
- self.write("ok")
23. 简单的封装一下ORM
1. 如图新建ORM文件夹
- 文件zjMySQL进行了修改
- from .zjMysql import zjMySQL
- class ORM():
- def save(self):
- #insert into students(name,age) values ("小李",22)
- tableName = (self.__class__.__name__).lower() #表名
- #self.__class__获取当前的类;__name__获取当前调用的对象的类名;lower()转小写
- fieldsStr =valuesStr="(" #fieldsStr代表(name,age);valuesStr代表("小李",22)
- for field in self.__dict__: #self.__dict__得到字典的键值对{"小李":22,"小白":23}中的属性名
- fieldsStr += (field + ",") #循环1(name, ;循环2 (name,age,
- if isinstance(self.__dict__[field],str): #判断key-valuede中value值是否是字符串
- valuesStr += ("'"+self.__dict__[field]+"',")
- else: #不是则为数字
- valuesStr +=(str(self.__dict__[field])+",") #转为字符串
-
- fieldsStr = fieldsStr[:len(fieldsStr)-1]+")" #截取name (name,age,之前,就把逗号去掉,拼接“)”变成(name,age)
- valuesStr = valuesStr[:len(valuesStr)-1]+")" #一样的截取掉后面的逗号,("小李",22)
- sql = "insert into " +tableName +" "+ fieldsStr+"values "+valuesStr
- db = zjMySQL()
- db.insert(sql)
-
- def delete(self):
- pass
-
- def update(self):
- pass
-
- @classmethod #装饰为类方法,类名来调用
- def all(cls):
- #select * from students
- tableName = (cls.__name__).lower()
- sql = "select * from " +tableName
- db = zjMySQL()
- return db.get_all_obj(sql,tableName)
-
- @classmethod
- def filter(cls):
- pass
2.文件orm中:只先封装insert和all功能
- from .zjMysql import zjMySQL
- class ORM():
- def save(self):
- #insert into students(name,age) values ("小李",22)
- tableName = (self.__class__.__name__).lower() #表名
- #self.__class__获取当前的类;__name__获取当前调用的对象的类名;lower()转小写
- fieldsStr =valuesStr="(" #fieldsStr代表(name,age);valuesStr代表("小李",22)
- for field in self.__dict__: #self.__dict__得到字典的键值对{"小李":22,"小白":23}中的属性名
- fieldsStr += (field + ",") #循环1(name, ;循环2 (name,age,
- if isinstance(self.__dict__[field],str): #判断key-valuede中value值是否是字符串
- valuesStr += ("'"+self.__dict__[field]+"',")
- else: #不是则为数字
- valuesStr +=(str(self.__dict__[field])+",") #转为字符串
-
- fieldsStr = fieldsStr[:len(fieldsStr)-1]+")" #截取name (name,age,之前,就把逗号去掉,拼接“)”变成(name,age)
- valuesStr = valuesStr[:len(valuesStr)-1]+")" #一样的截取掉后面的逗号,("小李",22)
- sql = "insert into " +tableName +" "+ fieldsStr+"values "+valuesStr
- db = zjMySQL()
- db.insert(sql)
-
- def delete(self):
- pass
-
- def update(self):
- pass
-
- @classmethod # 装饰为类方法,类名来调用
- def all(cls):
- #select * from students
- tableName = (cls.__name__).lower()
- sql = "select * from " +tableName
- db = zjMySQL()
- return db.get_all_obj(sql,tableName)
-
- @classmethod
- def filter(cls):
- pass
3. 新建了models.py,表的属性
- from ORM.orm import ORM
-
- class Students(ORM): #继承与ORM
- def __init__(self,name,age):
- self.name = name
- self.age =age
4. views/index中
如果没有路由,相应的配置一下路由
注意,路由要放在静态路由((r”/(.*)$”,tornado.web.StaticFileHandler,{“path”:os.path.join(config.BASE_DIRS,“static/html”),“default_filename”:“index.html”}),)之前,不然访问路由会报错
- from models import Students
-
- class StudentsHandler(RequestHandler): #数据库中获取信息,并展示
- def get(self, *args, **kwargs):
- stu = Students("小黑",24)
- stu.save() #存入数据
运行访问http://127.0.0.1:9000/students
进入数据库刷新