Python中的ORM工具:SQLAlchemy

版权声明:转载请注明出处 https://blog.csdn.net/qq_28804275/article/details/82798664

ORM全称Object Relational Mapping, 翻译过来叫对象关系映射。在Python生态中,目前较为流行的ORM模块有SQLAlchemy和peewee,类比Java中有Hibernate和MyBatis。本文关注SQLAlchemy的快速上手,展示一个简单的 CRUD 示例,并结合使用 Faker 生成测试数据。

环境说明

  • python v3.6.5
  • sqlalchemy v1.2.11
  • faker v0.9.1(生成伪造数据)

安装环境

	pip install sqlalchemy faker

CRUD示例

SQLAlchemy支持大多数关系型数据库,示例中使用的是PostgreSQL,用法及说明大多已在源代码中注释,具体请参考如下:

from faker import Factory
from sqlalchemy import or_
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, String, Integer, create_engine

# 创建对象的基类:
Base = declarative_base()


# 定义User对象并继承上述基类
class User(Base):
    # 表名(继承自Base的类必须要定义__tablename__)
    __tablename__ = 'tb_user'

    # 表字段
    id = Column(Integer, primary_key=True, autoincrement=True, comment="自增主键")
    email = Column(String(64), nullable=False, index=True, comment="邮箱")
    username = Column(String(64), nullable=False, comment="用户名")
    password = Column(String(64), comment="密码")

    def __str__(self) -> str:
        return "User(id:{} email:{} username:{} password:{})".format(self.id, self.email,
                                                                     self.username, self.password)


# 创建数据库连接('数据库类型+数据库驱动名称://用户名:密码@ip地址:端口/数据库名')
conn = "postgresql+psycopg2://postgres:<password>@<ip>:5432/postgres"
engine = create_engine(conn, encoding='UTF-8', echo=False)  # echo=True表示输出执行日志,默认为False

# 删除映射数据表(如果存在)
Base.metadata.drop_all(engine)
# 创建映射数据表(如果不存在)
Base.metadata.create_all(engine)

# 创建session对象
Session = sessionmaker(bind=engine)
session = Session()

""" CREATE """

# 创建User对象
user = User(username="张三", password="zs", email="[email protected]")
# 添加到session
session.add(user)
# 提交到数据库:
session.commit()

# 创建faker工厂对象
faker = Factory.create()
# 利用faker创建多个User对象
fake_users = [User(
    username=faker.name(),
    password=faker.word(),
    email=faker.email(),
) for i in range(5)]
# 添加到session
session.add_all(fake_users)
# 保存到数据库:
session.commit()

""" RETRIEVE/GET/FIND """

# 主键id查找
user = session.query(User).get(3)
print(user)
# 添加过滤条件
user = session.query(User).filter(User.id != 1).first()
print(user)
# one()方法查找不存在或返回结果集不止一个对象会抛异常,first()对应则返回None或首条数据
user = session.query(User).filter_by(id=4).one()
print(user)
# 模糊搜索
user = session.query(User).filter(User.username.like('%张%')).first()
print(user)
user = session.query(User).filter(User.username.notlike('%张%')).first()
print(user)
# And and Or
user = session.query(User).filter(User.id == 1, User.username.like('%张%')).one()
print(user)
user = session.query(User).filter(or_(User.id == 2, User.username.like('%张%'))).first()
print(user)
# 查找全部
users = session.query(User).all()
for u in users:
    print(u)

""" UPDATE """

user = session.query(User).get(1)
user.username, user.password = '李四', 'ls'
session.add(user)
session.commit()

""" DELETE """
user = session.query(User).get(6)
session.delete(user)
session.commit()

session.close()

参考链接

SQLAlchemy(一)
SQLAlchemy(二)
使用SQLAlchemy

示例源码
欢迎关注我的个人公众号:超级码里奥
如果这对您有帮助,欢迎点赞和分享,转载请注明出处

猜你喜欢

转载自blog.csdn.net/qq_28804275/article/details/82798664