1.ORM
在服务器后台,数据是要存储在数据库的,但是如果项目在开发和部署的时候,是使用的不同的数据库,该怎么办呢?是不是需要把所有的 SQL 语句都再重新写一遍呢?
ORM
ORM全称 Object Relational Mapping对象关系映射
通过 ORM 可以不用关心后台是使用的哪种数据库,只需要按照 ORM 所提供的语法规则去书写相应的代码, ORM 就会自动的转换成对应对应数据库的 SQL 语句
2. SQLAlchemy连接数据库
第一步:安装
安装: mysql
安装python包: pymysql、sqlalchemy
pip安装 python 包
pip install -i https://pypi.douban.com/simple pymysql
pip install -i https://pypi.douban.com/simple sqlalchemy 这里是使用国内的源
创建/data目录,在下面创建connect.py文件
from sqlalchemy import create_engine #第二步:导入模块
#第三步:数据库数据 USERNAME = 'admin' PASSWORD = 'Root110qwe' HOST = '127.0.0.1' PORT = 3306 DATABASE = 'mydb' Db_url = 'mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8'.format( #第四步:数据连接 URL
USERNAME, PASSWORD, HOST, PORT, DATABASE ) engine = create_engine(Db_url) #第五步:连接数据库
if __name__ == '__main__': #第六步:测试连接
connection = engine.connect() #定义游标 result = connection.execute('select 1') print(result.fetchone())
3.创建Module
第一步:创建 Module 的 Base 类
在connect.py文件中生成Base类
from sqlalchemy.ext.declarative import declarative_base Base = declarative_base(engine) #数据库建模使用继承来建立
对象关系型映射,数据库中的表与python中的类相对应,创建的类必须继承自 sqlalchemy 中的基类。
使用 declarative 方法定义的映射类依据一个基类,这个基类是维系类和数据表关系的目录。
应用通常只需要有一个 Base 的实例。我们通过 declarative_base() 功能创建一个基类。
第二步:创建 Module
新增user_modules.py文件
#这个文件是用来建立模型 from connect import Base from sqlalchemy import Column,Integer,String,DateTime,Boolean from datetime import datetime class User(Base): ''' 建立一个User模型,建立一张user表 ''' __tablename__ = 'user' id = Column(Integer,autoincrement=True,primary_key=True) username = Column(String(20)) password = Column(String(20)) create_time = Column(DateTime,default=datetime.now()) _locked = Column(Boolean,default=False,nullable=False) #当前用户是否已经登录,是否还能登录
#第三步:创建 Module
if __name__ == '__main__': Base.metadata.create_all() #创建表格
再次强调,我们用类来表示数据库里面的表!!!
这些表的类都继承于我们的Base基类。
在类里面我们定义一些属性,这个属性通过映射,就对应表里面的字段
Module
__tablename__: 数据库中的表名
Column: 用来创建表中的字段的一个方法
Integer: 整形,映射到数据库中的int类型
String: 字符类型,映射到数据库中的varchar类型,使用时,需要提供一个字符长度
DateTime: 时间类型
4. 数据的增删改查
第一步:创建会话
在connect.py中添加
from sqlalchemy.orm import sessionmaker Session = sessionmaker(engine) #生成一个会话类,用来操作数据 session = Session()
在对表数据进行增删改查之前,先需要建立会话,建立会话之后才能进行操作,就类似于文件要打开之后才能对文件内容操作
add
add 是添加一条数据, add_all 添加多条数据
query
query 就是查询的意思,在 SQLAlchemy 中也用来查询数据
all 是查询所有的意思
first 是查询第一条数据
在后面会详细介绍更过的用法
update
update更新是需要使用字典传值
delete
使用 delete 方法来删除数据
创建test_user_module.py文件。
from connect import session from user_modules import User def add_user(): '''添加数据''' person = User(username='shiwei',password='1234') session.add_all([ #接收一个列表,添加多条,每一条是列表里面的一个元素 User(username='塔卡',password='12341'), User(username='小泼',password='55432'), User(username='清空',password='12341'), ]) # session.add(person) #会默认开启一个事物,添加一条 session.commit() #提交事务 def search_user(): '''查看数据''' rows = session.query(User).all() #查询所有 # rows = session.query(User).first() #查询第一条 print(rows) def update_user(): '''更新数据''' #更新是需要使用字典传值 session.query(User).filter(User.username == '塔卡').update({User.password:'23115'}) session.commit() def delete_user(): '''删除数据''' rows = session.query(User).filter(User.username == '式微')[0] #需要使用索引取原生SQL值,不然会是 print(rows) session.delete(rows) session.commit() if __name__ == '__main__': delete_user()
执行查询search_user()时,会显示如下内容。需要对module模块进行重写__repr__
[<user_modules.User object at 0xb679104c>, <user_modules.User object at 0xb679190c>, <user_modules.User object at 0xb679194c>, <user_modules.User object at 0xb679198c>, <user_modules.User object at 0xb67919cc>]
class User(Base): ''' 建立一个User模型,建立一张user表 ''' __tablename__ = 'user' id = Column(Integer,autoincrement=True,primary_key=True) username = Column(String(20)) password = Column(String(20)) create_time = Column(DateTime,default=datetime.now()) _locked = Column(Boolean,default=False,nullable=False) #当前用户是否已经登录,是否还能登录 def __repr__(self): return ''' <User(id=%s,username=%s,create_time=%s,_locked=%s)> '''%(self.id,self.username,self.password,self._locked)
重新运行search_user.py文件,展示结果如下,解析成容易读取的信息: