专栏首页happyJaredPython中的ORM工具:SQLAlchemy

Python中的ORM工具:SQLAlchemy

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

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Python中的ORM工具:Peewee

    上一篇文章介绍了Pyhton中的ORM工具:SQLAlchemy。本文延续之前的风格,介绍另一个ORM模块:Peewee,希望通过简单的CRUD示例可以帮助大家...

    happyJared
  • 面向切面的Spring

      本文是博主在看完面向切面的Spring(《Spring实战》第4章)后的一些实践笔记。   为什么要用AOP呢?作者在书中也明确提到了,使用AOP,可以让...

    happyJared
  • 布隆过滤器原理

    如图所示,当字符串存储要加入到布隆过滤器中时,该字符串首先由多个哈希函数生成不同的哈希值,然后在对应的位数组的下表的元素设置为 1(当位数组初始化时 ,所有位置...

    happyJared
  • 如何辨别一个程序员水平的高低?

    问题:如何辨别一个程序员水平的高低? 工作3-5年,大家都做过点什么?但是有的程序员只是技术迁移、完全没解决问题的能力啊?大家盘点下,在你眼中,高工作年限的程序...

    前朝楚水
  • Go基础之--位操作中你所不知道的用法

    之前一直忽略的就是所有语言中关于位操作,觉得用处并不多,可能用到也非常简单的用法,但是其实一直忽略的是它们的用处还是非常大的,下面先回顾一下位操作符的基础 位操...

    coders
  • [php][thinkphp] 记一次Composer Linux版安装以及用它进行thinkphp项目初始化

    php中开启exec,system等函数调用系统命令 修改php.ini文件 关掉安全模式 safe_mode = off 然后在看看 禁用函数列表 disab...

    landv
  • 设计模式之单例模式(一)

    这篇我们学习的是单例模式,相信很多朋友都或多或少使用过这个模式。很多设计模式的入门,都把单例模式作为第一个的,但是因为我们是跟着书本学习,所以放在了第五个里面。...

    程序员小跃
  • 听说你的爬虫又被封了 ?

    上一篇文章《爬虫利器初体验》中,我们举了个简单的栗子,但是在真实的开发中这样的爬虫代码很容易就会被封掉。那么怎么样才能避免这些事发生呢?这一这篇文章我们一起来学...

    小小詹同学
  • Scrapy框架系列--爬虫又被封了?(2)

    上一篇文章《爬虫利器初体验(1)》中,我们举了个简单的栗子,但是在真实的开发中这样的爬虫代码很容易就会被封掉。那么怎么样才能避免这些事发生呢?这一这篇文章我们一...

    1480
  • 支持跨进程单例的一种实现方案

    零 烫烫烫烫烫烫 单例模式,也叫单子模式,是一种常用的软件设计模式。在应用这个模式时,单例对象的类必须保证只有一个实例存在。许多时候整个系统只需要拥有一个的全局...

    QQ音乐技术团队

扫码关注云+社区

领取腾讯云代金券