初学Python,小记。若有不足,望指,感激涕零!
一、什么是SQLAlchemy?
自我理解:
alchemy 炼金术。SQL炼金术?也可如此理解。炼金,即为“提炼精华",将Python中连接MySQL的重点、核心部分提炼出来,然后把这些技术封装在SQLAlchemy软件中。技术大成,成为所谓的”炼金术士“!
正式理解:
SQLAlchemy是最流行的关系型数据库的ORM框架,提供SQL工具包和对象关系映射(ORM)工具。
二、什么是ORM?
ORM(Object Relational Mapping),对象关系映射,即将数据库中的表与面向对象中的类建立一种对应关系。
通过ORM我们可以直接使用Python的类的方式做数据库开发,而不再直接写原生的SQL语句(甚至不需要SQL基础)。
三、SQLAlchemy有什么优点?
- 高效、高性能:访问数据库时效率高。
- 解脱SQL语句:让我们使用类和对象的方式访问数据库,从而解脱繁琐的SQL语句。
四、sqlalchemy怎么使用?
4.1 安装SQLAlchemy
$ pip install sqlalchemy
(因学习时已安装好,自己也没实际操作,借鉴资料先做记录,后续完善。)
4.2 连接MySQL
(1)建立连接引擎和会话
from sqlachemy import caeate_engine
from sqlalchemy.orm import scoped_session,sessionmaker
engine = create_engine(setting.read_URL())
session = scoped_session(sessionmaker(bind=engine))
engine,和数据库连接的引擎。正如汽车需要引擎驱动,SQLAlchemy也需要Engine来驱动。Engine维护了一个数据库连接池对象(Pool)。
create_engine()方法即创建了一个连接数据库的引擎。创建此引擎时需要一个URL表明连接数据库的信息,还有一些其他的参数配置。
create_engine()参数详解:
- pool_size: 设置连接池中保持的连接数。
- max_overflow: 当连接数使用量达到pool_size且又有请求时,允许再新建的连接数。
- pool_timeout:当连接数达到pool_size+max_overflow且又有新的请求时,进程会等待pool_timeout秒,超过这个时间会抛出异常。
- pool_recycle:一个数据库连接的生存时间,以秒为单位。
- url:要连接的数据库的参数配置,格式为:
sort+driver://username:passward@host:port/database
sort:要连接数据库的类型
driver:数据库连接驱动(Python2使用mysqldb,Python3使用pymysql)
username:用户名
passward:密码
host:服务器地址
port:端口号
database:要连接的数据库
session,会话,用于与数据库对话。说白了,就是用于和数据库交互。
sessionmaker()创建了一个会话工厂类,创建此工厂类时需要绑定引擎,表示此会话工厂要产出哪个数据库连接的会话。
sessionmaker()创建的session只可以单线程使用,即同一时刻此session只供一个对象使用。而scoped_session()创建的session可在多线程下共享,即同一时刻多个对象可同时使用此session。
(2)建立映射关系类
#生成orm基类,用作映射
Base = declarative_base()
#生成数据库表模型
class Student(Base):
__tablename__ = 'student'
id = Column(Integer,primary_key = True)
name = Column(String(32))
age = Column(String(32))
sex = Column(String(32))
score = Column(String(32))
def __repr__(self):
return "<Student id:%d, name:%s, age:%s, sex:%s, score:%s>"%(self.id,self.name,self.age,self.sex,self.score)
tablename绑定的是数据库表的名字
repr函数是规范对象的输出格式,类似于Java中的toString方法。基类的repr方法返回的是地址,如果不重写此方法,则打印出的为对象的地址。
(3)执行SQL操作
#增加数据
def insert(name_,age_,sex_,score_):
obj = Student(name=name_,age=age_,sex=sex_,score=score_)#生成数据对象
session.add(obj) #把数据对象放入session中
session.commit()
将要增加的信息封装成一个对象,以对象作为参数传递
将数据添加到session中一定要提交,增删改查操作都需要。这就好比货物运输,session就是运输车(也就是负责交互功能),当把要运输的货物装上车后,要让运输车把货物运送到目的地,这就相当于commit的过程。只有commit了,执行的操作才会生效。
#查询所有的数据
def select_all():
results = session.query(Student).all()
使用query方法查询数据
#修改数据
def uodate(id_,list_up) #根据id修改信息,list_up为要修改的数据集合
result = session.query(Student).filter(Student.id==id_).update(list_up)
print(result)
list_up的格式为:
{'name':'测试'},即将要修改的数据放到一个字典里。
修改数据的思路为先查出要修改的数据,然后对数据进行操作。
#删除数据(先查后删)
def delete(id_):
result = db.session.query(Student).filter(Student.id == id_).delete()
db.session.commit()
print(result)
参考链接
https://www.leixue.com/what-is-sqlalchelmy
https://www.jb51.net/article/164591.htm