ORM
ORM,对象关系映射,对象和关系之间的映射,使用面向对象的方式来操作数据库。
关系模型和Python对象之间的映射
table => class ,表映射为类
row => object ,行映射为实例
column => property ,字段映射为属性
SQLAlchemy
SQLAlchemy是一个ORM框架
安装
pip install sqlalchemy
官方文档
(官方文档http://docs.sqlalchemy.org/en/latest/)[http://docs.sqlalchemy.org/en/latest/]
开发使用
SQLAlchemy内部使用了连接池
第一步 :创建连接,创建实体类
dialect+driver://username:password@host:port/database
mysqldb的连接
mysql+mysqldb://<user>:<password>@<host>[:<port>]/<dbname>
engine = sqlalchemy.create_engine("mysql+mysqldb://wayne:wayne@127.0.0.1:3306/magedu")
pymysql的连接
mysql+pymysql://<username>:<password>@<host>/<dbname>[?<options>]
engine = sqlalchemy.create_engine("mysql+pymysql://wayne:wayne@127.0.0.1:3306/magedu")
engine = sqlalchemy.create_engine("mysql+pymysql://wayne:wayne@127.0.0.1:3306/magedu",
echo=True)
echo=True
引擎是否打印执行的语句,调试的时候打开很方便。
lazy connecting:懒连接。创建引擎并不会马上连接数据库,直到让数据库执行任务时才连接。
举例:
import sqlalchemy
from sqlalchemy import create_engine, Column, String, Integer,Enum,Date,ForeignKey # 导入外键
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker,relationships
HOST = '172.22.141.122'
USERNAME = 'eric01'
PASSWORD = 'eric01'
DBNAME = 'test'
PORT = 3306
engine = create_engine("mysql+pymysql://{}:{}@{}:{}/{}".format(USERNAME, PASSWORD, HOST, PORT, DBNAME),
echo=True) # echo =True ,后期会将语句报保存到日志
print(engine)
# ORM Maping
Base = declarative_base()
class Student(Base): # 创建表
__tablename__ = 'student' # 指定数据库表对应
id = Column(Integer, primary_key=True, autoincrement=True) # 字段名一致 不重复写
# 主键和自增
name = Column(String(64), nullable=False)
age = Column(Integer)
def __repr__(self):
return "<{} id = {}, name = {},age = {}>" .format(
__class__.__name__, self.id, self.name,self.age)
# 创建后将不需要在执行下面的语句
# Base.metadata.drop_all(engine) # 删除base 所管理的所有mapping类
# Base.metadata.create_all(engine)
from sqlalchemy.orm.session import Session
session:Session = sessionmaker(bind = engine)() # 实例化
print(session,type(session))
student = Student(name= 'tom' )
student.name= 'jerry'
student.age = 20
print( student)
session.add(student) # 将student 加入到session 中
session.commit() #提交
# ##########方法二:
try:
try:
session.add_all([student])
session.commit()
print(' ~~~~~~~~~~')
except:
session.rollback()
print('++++++++++++')
### add_all()方法不会提交成功的,不是因为它不对,而是student,student成功提交后,sudent的主键就有了值,所以,只要student没有修改过,就认为没有改动。如下,student变化了,就可以提交修改了。
生产环境很少这样创建表,都是系统上线的时候由脚本生成。
生产环境很少删除表,宁可废弃都不能删除。
第二步 : 创建会话 session
在一个会话中操作数据库,会话建立在连接上,连接被引擎管理。
当第一次使用数据库时,从引擎维护的连接池中获取一个连接使用。
# 创建session
Session = sessionmaker(bind = engine)
session = Session() # 实例化
第三步: 数据库操作
1> 查询
students = session.query(Student) # 并没有真的查询,只是返回个查询集,是懒查询
print(students)
print(students.count())# 可以查询个数,但这是个子查询
for x in students:
print(x)
2> 改数据
student