美文网首页
Python 中的 ORM 工具:SQLAlchemy

Python 中的 ORM 工具:SQLAlchemy

作者: happyJared | 来源:发表于2019-12-11 09:06 被阅读0次

    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="123@zs.com")
    # 添加到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

    示例源码

    文章已授权转载,原文链接:Python 中的 ORM 工具:SQLAlchemy

    相关文章

      网友评论

          本文标题:Python 中的 ORM 工具:SQLAlchemy

          本文链接:https://www.haomeiwen.com/subject/mprvgctx.html