tornado 06 数据库—ORM—SQLAlchemy——基本内容及操作
tornado 06 数据库—ORM—SQLAlchemy——基本内容及操作
一、 ORM
#在服务器后台,数据是要储存在数据库的,但是如果项目在开发和部署的时候,是使用的不同的数据库,该怎么办?是不是需要把所有的SQL语句在重新写一遍呢? #用ORM隔离框架和数据库 tornado ------> ORM -------> 数据库
#ORM #全称:Object Relational Mapping 对象关系映射 #通过ORM可以不用关心后台是使用的哪种数据库,只需要按照ORM所提供的语法规则去书写相应的代码,ORM就会自动地转换成对应数据库的SQL语句
二、SQLAlchemy 连接数据库
#1、安装SQLAlchemy pip install pymysql pip install sqlalchemy
#2、导入模块 from sqlalchemy import create_engine
#3、数据库数据 HOSTNAME = '127.0.0.1' PORT = '3306' DATABASE = 'mydb' USERNAME = 'admin' PASSWORD = 'Root110qwe'
#4、创建数据库 mysql -u root -p qwe123 #进入mysql create database `mydb`; #创建mydb数据库 select host,user from mysql.user; #查看host user grant all on *.* to 'admin'@'%'; # 赋予权限 flush privileges; #刷新数据库
python代码,这是在connect.py里面的代码
from sqlalchemy import create_engine HOSTNAME = '127.0.0.1' PORT = '3306' DATABASE = 'mydb' USERNAME = 'admin' PASSWORD = 'Root110qwe' Db_url = 'mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8'.format( USERNAME, PASSWORD, HOSTNAME, PORT, DATABASE ) engine = create_engine(Db_url) if __name__ == '__main__': connetion = engine.connect() result = connetion.execute('select 1') print(result.fetchone())
三、创建module
#刚才已经使用SQLAlchemy连上数据库,现在该如何在数据库里面新建表呢?
#数据库里面的一张表代表python中的一个类
#第1步 创建Module的Base类,在connect.py里面添加 from sqlalchemy.ext.declarative import declarative_base Base = declarative_base(engine) #对象关系类映射,数据库中的表和python中的相对应,创建的类必须继承自sqlalchemy中的基类 #使用declarative方法定义的映射类依据一个基类,这个基类是维系类和数据表关系的目录 #应用通常只需要有一个Base的实例。我们通过declarative_base() 功能创建一个基类。
#以后换数据库的时候,只需要改变数据库的上面的代码,如HOSTNAME等等,后面的user_modules都不需要改变
#第2步 创建Module 在user_module.py里面输入一下代码 from datetime import datetime from sqlalchemy import Column,Integer,String,DateTime,Boolean from connect import Base class User(Base): __tablename__ = 'user' id = Column(Integer,primary_key=True,autoincrement=True) username = Column(String(20)) password = Column(String(50)) creatime = Column(DateTime,default=datetime.now) _locked = Column(Boolean,default=False,nullable=False) def __repr__(self): #这一段可有可无 return """<User(id=%s)> """%( self.id ) #我们用类来表示数据库里面的表!!! #这些表的类都继承于我们的Base基类 #在类里面我们定义一些属性,这个属性通过映射,就对应表里面的字段
#第3步 创建Module if __name__ == '__main__': Base.metadata.create_all() #执行此代码,就会把创建好的Module映射到数据库中
Module __tablename__ = 'user' #数据库中的表名 id = Column(Integer,primary_key=True,autoincrement=True)#Column用来创建表中的字段的一个方法;整型,映射到数据库中的int类型;表内元素分别为主键和自动添加编号 username = Column(String(20)) #字符类型,映射到数据库中的varchar类型,需要提供一个字符长度 password = Column(String(50)) creatime = Column(DateTime,default=datetime.now) #时间类型 _locked = Column(Boolean,default=False,nullable=False) #表内元素分别表示默认和非空
#想要from connect import Base不报错(报错时是可以运行代码的) #在data文件夹里面右键 选中Mark directory as 选中sources root
四、增删改查
#如何增删改查数据库里面的数据呢 #在connect.py里面输入一下代码 from sqlalchemy.orm import sessionmaker Session = sessionmaker(engine) session = Session()
#再创建一个test_user_module.py用来实现增删改查
from connect import session #导入session from user_modules import User #导入module def add_user(): #增 person = User(username='gaohuiqi',password='123') #插入1条 #session.add(person) session.add_all([ User(username='zhouzhou',password='123'), User(username='lala',password='1234') ] )# 插入多条数据 session.commit() #刷入 def search_user():#查 rows = session.query(User).all() #查询所有 rows = session.query(User).first() #查询第一个 print(rows) def update_user():#改 rows = session.query(User).filter(User.username=='gaohuiqi').update({User.password:1}) session.commit() def delete_user():#删除 rows = session.query(User).filter(User.username=='gaohuiqi')[0] print(rows) session.delete(rows) session.commit() if __name__=='__main__': #调用 # add_user() # search_user() # update_user() delete_user()
#查 在查的时候如果出现一些内存地址而不是具体的表的数据,就需要在前面写上user_module.py里面写上repr(重写函数)