1.安装sqlalchemy
pip install sqlalchemy;
2.SQLALchemy介绍
-
可以把model中的模型和数据库中的一行数据相互映射的工具;
-
将代码中的数据模型与表中的字段一一对应;
3.什么是ORM
-
ORM(Object Relational Mapper)就是把数据库表的行与相应的对象建立关联,互相转换;
-
目前,最知名的Python ORM是SQLAlchemy和SQLobject;
4.实体类的创建的两个好处
-
如果数据库中没有表,那么可以使用实体类创建;
-
如果数据库中有表,实体类可以映射表的结构,对表的CRUD操作;
5.数据库操作
- 创建表:
create_all()
; - 删除表:
drop_all()
,或者是session.delete()
;
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String
from sqlalchemy.orm import sessionmaker
Base = declarative_base()
class Teacher(Base):
__tablename__ = 'teacher'
id = Column(Integer, primary_key=True, autoincrement=True)
name = Column(String(255))
age = Column(Integer)
def __repr__(self):
# print(self.__dict__)
return "id='%s', name='%s', age='%s" % (self.id, self.name, self.age)
__str__ = __repr__
# 创建连接引擎
host = 'localhost'
port = 3306
username = 'robby'
password = 'robby123456'
db = 'XKD_Python_Course'
connect_str = 'mysql+mysqldb://{}:{}@{}:{}/{}'.format(username, password, host, port,db)
engine = create_engine(connect_str, echo=True)
# 创建表
Base.metadata.create_all(engine)
# 删除表
Base.metadata.drop_all(engine)
- 插入数据:
session.add_all()
;
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String
from sqlalchemy.orm import sessionmaker
Base = declarative_base()
class Teacher(Base):
__tablename__ = 'teacher'
id = Column(Integer, primary_key=True, autoincrement=True)
name = Column(String(255))
age = Column(Integer)
def __repr__(self):
# print(self.__dict__)
return "id='%s', name='%s', age='%s" % (self.id, self.name, self.age)
__str__ = __repr__
# 创建连接引擎
host = 'localhost'
port = 3306
username = 'robby'
password = 'robby123456'
db = 'XKD_Python_Course'
connect_str = 'mysql+mysqldb://{}:{}@{}:{}/{}'.format(username, password, host, port,db)
engine = create_engine(connect_str, echo=True)
# 创建会话,用于提交数据
Session = sessionmaker(bind=engine)
session = Session()
# 创建多行行实例,给表添加数据
try:
lst = []
for i in range(10):
teacher = Teacher()
teacher.name = 'nihao' + str(i)
teacher.age = 20 + i
lst.append(teacher)
print(teacher)
# session.add(student) 可以添加一行记录,也可以添加多行记录
# 注意:这里加行记录实例添加到session,不会提交,需要手动提交
session.add_all(lst) # pendding
except Exception as e:
print('~~~~~~~~~~~'*200)
session.rollback()
print(e)
finally:
session.commit()
- 查询操作:
session.query()
,迭代查询;
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String
from sqlalchemy.orm import sessionmaker
Base = declarative_base()
class Teacher(Base):
__tablename__ = 'teacher'
id = Column(Integer, primary_key=True, autoincrement=True)
name = Column(String(255))
age = Column(Integer)
def __repr__(self):
# print(self.__dict__)
return "id='%s', name='%s', age='%s" % (self.id, self.name, self.age)
__str__ = __repr__
host = 'localhost'
port = 3306
username = 'robby'
password = 'robby123456'
db = 'XKD_Python_Course'
conn_str = 'mysql+mysqldb://{}:{}@{}:{}/{}'.format(username, password, host, port,db)
engine = create_engine(conn_str, echo=False)
Session = sessionmaker(bind=engine)
session = Session()
teacher_obj = session.query(Teacher)
for teacher in teacher_obj:
print(teacher) # 返回结果:{'_sa_instance_state': <sqlalchemy.orm.state.InstanceState object at 0x1063125f8>, 'age': 20, 'name': 'nihao0', 'id': 1}
print('*'*300)
# 直接返回实例对象
teacher = session.query(Teacher).get(4)
print(teacher) # 返回结果:{'_sa_instance_state': <sqlalchemy.orm.state.InstanceState object at 0x1075fd400>, 'age': 23, 'name': 'nihao3', 'id': 4}
print(teacher.id) # 返回 aobama
print(teacher.name)
print(teacher.age)
print('*'*300)
# 返回的是可迭代对象
teacher_results = session.query(Teacher).filter(Teacher.id == 5)
for teacher in teacher_results: # 拿到student实例对象
print(teacher)
- 修改操作:
session.update()
;
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String
from sqlalchemy.orm import sessionmaker
Base = declarative_base()
class Teacher(Base):
__tablename__ = 'teacher'
id = Column(Integer, primary_key=True, autoincrement=True)
name = Column(String(255))
age = Column(Integer)
def __repr__(self):
# print(self.__dict__)
return "id='%s', name='%s', age='%s" % (self.id, self.name, self.age)
__str__ = __repr__
# 创建连接引擎
host = 'localhost'
port = 3306
username = 'robby'
password = 'robby123456'
db = 'XKD_Python_Course'
conn_str = 'mysql+mysqldb://{}:{}@{}:{}/{}'.format(username, password, host, port,db)
engine = create_engine(conn_str, echo=False)
# 创建会话,用于提交数据
Session = sessionmaker(bind=engine)
session = Session()
teacher = session.query(Teacher).get(4)
teacher.name = 'Robby'
teacher.age = '99'
session.commit()
- 提交:
session.commit()
;
6.where条件查询
-
where条件查询过滤, 返回可迭代对象;
-
AND取与、OR取并、NOT取反、in存在、not in不存在;
-
like可以忽略大小写进行模式匹配;
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String, DATE, Enum, ForeignKey
import enum
from sqlalchemy.orm import sessionmaker
Base = declarative_base()
class My_Enum(enum.Enum):
M = 'M'
F = 'F'
# 实体类
class Emploee(Base):
'''
+------------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------+---------------+------+-----+---------+-------+
| emp_no | int(11) | NO | PRI | NULL | |
| birth_date | date | NO | | NULL | |
| first_name | varchar(14) | NO | | NULL | |
| last_name | varchar(16) | NO | | NULL | |
| gender | enum('M','F') | NO | | NULL | |
| hire_date | date | NO | | NULL | |
+------------+---------------+------+-----+---------+-------+
'''
__tablename__ = 'employees'
emp_no = Column(Integer, primary_key=True, nullable=False)
birth_date = Column(DATE, nullable=False)
first_name = Column(String(14), nullable=False)
last_name = Column(String(16),nullable=False)
gender = Column(Enum(My_Enum), nullable=False)
hire_date = Column(DATE, nullable=False)
def __repr__(self):
return "emp_no='%s', birth_date='%s', first_name='%s', last_name='%s', gender='%s', hire_date='%s'" % (self.emp_no, self.birth_date, self.first_name, self.last_name, self.gender, self.hire_date)
__str__ = __repr__
# 创建连接引擎
host = 'localhost'
port = 3306
username = 'robby'
password = 'robby123456'
db = 'XKD_Python_Course'
conn_str = 'mysql+mysqldb://{}:{}@{}:{}/{}'.format(username, password, host, port,db)
engine = create_engine(conn_str, echo=False)
# 创建表
Base.metadata.create_all(engine)
# 创建会话,用于提交数据
Session = sessionmaker(bind=engine)
session = Session()
# # 简单的where条件查询过滤, 返回可迭代对象, AND 取与
emploees = session.query(Emploee).filter(Emploee.emp_no < 10010).filter(Emploee.gender == 'M')
emploees = session.query(Emploee).filter((Emploee.emp_no > 10010) & (Emploee.gender == 'F'))
# OR 取并
emploees = session.query(Emploee).filter((Emploee.emp_no > 10010) | (Emploee.gender == 'F'))
# NOT 取反
emploees = session.query(Emploee).filter(~(Emploee.emp_no > 10010))
# in
emploees = session.query(Emploee).filter(Emploee.emp_no.in_([10010, 10011, 10012]))
# not in
emploees = session.query(Emploee).filter(~Emploee.emp_no.in_([10010, 10011, 10012]))
# like ,like可以忽略大小写进行模式匹配
emploees = session.query(Emploee).filter(Emploee.last_name.like('B%'))
for emploee in emploees:
print(emploee)
7.order排序
asc()
:升序;
例如:
emploees = session.query(Emploee).filter(Emploee.last_name.like('B%')).order_by(Emploee.emp_no.asc())
desc()
:降序;
例如:
emploees=session.query(Emploee).filter(Emploee.last_name.like('B%')).order_by(Emploee.emp_no.desc())
- 多字段排序:在语句里面进行多次排序;
8.聚合与分组
-
list()
:转化为列表; -
count()
:聚合count(*)查询;扫描二维码关注公众号,回复: 6011228 查看本文章 -
all()
: 转化为列表; -
limit().one()
:查询首行;
emploees = session.query(Emploee)
print(list(emploees)) # 转化为列表
print(emploees.count()) # 聚合count(*)查询
print(emploees.all()) # 转化为列表
print(emploees.limit(1).one()) # 查询首行
-
max()
:返回最大值; -
min()
:返回最小值; -
avg()
:返回平均值;
emploees = session.query(func.max(Emploee.emp_no))
emploees = session.query(func.min(Emploee.emp_no))
emploees = session.query(func.avg(Emploee.emp_no))
group_by()
:分组查询;
emploees = session.query(func.count(Emploee.emp_no)).group_by(Emploee.gender)
print(emploees)
for emploee in emploees:
print(emploee)