Python ORM框架SQLAlchemy操作

ORM

全称Object Relational Mapping(对象关系映射)。

特点是操纵Python对象而不是SQL查询,也就是在代码层面考虑的是对象,而不是SQL,体现的是一种程序化思维,这样使得Python程序更加简洁易读。

具体的实现方式是将数据库表转换为Python类,其中数据列作为属性,数据库操作作为方法。

优点

  1. 简洁易读:将数据表抽象为对象(数据模型),更直观易读
  2. 可移植:封装了多种数据库引擎,面对多个数据库,操作基本一致,代码易维护
  3. 更安全:有效避免SQL注入

具体实现库

  1. SQLObject
  2. Storm
  3. Django’s ORM
  4. peewee
  5. 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()

运行结果

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/youngdianfeng/article/details/106027497