ORM
全称Object Relational Mapping(对象关系映射)。
特点是操纵Python对象而不是SQL查询,也就是在代码层面考虑的是对象,而不是SQL,体现的是一种程序化思维,这样使得Python程序更加简洁易读。
具体的实现方式是将数据库表转换为Python类,其中数据列作为属性,数据库操作作为方法。
优点
- 简洁易读:将数据表抽象为对象(数据模型),更直观易读
- 可移植:封装了多种数据库引擎,面对多个数据库,操作基本一致,代码易维护
- 更安全:有效避免SQL注入
具体实现库
- SQLObject
- Storm
- Django’s ORM
- peewee
- SQLAlchemy
SQLAlchemy
这边主要介绍SQLAlchemy库的操作和使用。
SQLAlchemy 可以兼容多个数据库,不同数据库engine不一样而已,其他操作都一样。
MySQL-Python
mysql+mysqldb://<user>:<password>@<host>[:<port>]/<dbname>
pymysql
mysql+pymysql://<username>:<password>@<host>/<dbname>[?<options>]
cx_Oracle
oracle+cx_oracle://user:pass@host:port/dbname[?key=value&key=value...]
sqlite
sqlite:///dbname.db
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 Users(Base):
__tablename__ = "users"
id = Column(Integer, primary_key=True)
name = Column(String(64), unique=True)
email = Column(String(64))
def __init__(self, name, email):
self.name = name
self.email = email
engine = create_engine("mysql+pymysql://root:[email protected]:3306/bill_data",max_overflow=5)
# engine_example = create_engine("mysql+pymysql://user:password@hostname/dbname?charset=uft8",
# echo=True, # 将orm语句转化为sql语句打印
# pool_size = 8, # 连接池的大小,默认为5个
# pool_recycle=60*30 # 设置时间以限制数据库多久没连接自动断开
# )
Base.metadata.create_all(engine) # 创建表,如果表已经存在则忽略
# 如果creat_all报错,且是u"Unknown system variable 'tx_isolation'",则需要升级SQLAlchemy
# 数据库操作
# 创建session
engine = create_engine("mysql+pymysql://root:[email protected]:3306/bill_data")
DbSession = sessionmaker(bind=engine)
session = DbSession()
# flush:预提交,提交到数据库文件,但是未写入
# commit:提交
# rollback:回滚
# close:关闭
# 增
add_user = Users("test", "[email protected]")
session.add(add_user)
session.commit()
# 查
users = session.query(Users).all()
# users = session.query(Users).filter_by(id=1).all()
# users = session.query(Users).filter_by(Users.id == 1).all()
for item in users:
print(item.name)
# 改
session.query(Users).filter_by(id=1).update({
'name': "Jack"})
session.commit()
# 删
delete_users = session.query(Users).filter(Users.name == "test").first()
if delete_users:
session.delete(delete_users)
session.commit()
session.close()