程序在运行过程中所有的的数据都存储在内存 (RAM) 中,「RAM 是易失性存储器,系统掉电后 RAM 中的所有数据将全部丢失」。在大多数情况下我们希望程序运行中产生的数据能够长久的保存,此时我们就需要将数据保存到磁盘上,无论是保存到本地磁盘,还是通过网络保存到服务器上,最终都会将数据写入磁盘文件。将数据保存在磁盘中我们需要面对一个数据格式的问题,此时就需要引入数据库操作。
数据库是专门用于数据的集中存储和查询的软件,它便于程序保存和读取数据,且能够通过特定的条件查询指定的数据。
Python 的标准数据库接口为 Python DB-API,它为编程人员提供了完善的数据库应用标称接口。但是使用 Python DB-API 需要开发人员自行去拼接 SQL,并把 SQL 做成模板。此时全靠编程人员来保证系统的安全性,完全有人来保证系统的安全性,不可避免的会出现错误,为了减少人为原因产生的错误 ORM 框架应运而生。
ORM 即 Object-Relational Mapping,把关系数据库的表结构映射到对象上面。负责这个转换过程的就是 ORM 框架
Python 中的 ORM 框架主要有 SQLObject、Storm、Django's ORM、peewee、SQLALchemy。每种 ORM 框架都有各自的特点和相应的应用范围,本文主要介绍 SALALchemy,若你对其他框架感兴趣请自行搜索相关内容。
SQLAlchemy 简介
SQLAlchemy 是一个功能强大的开源 Python ORM 工具包。它提供了 “一个知名企业级的持久化模式的,专为高效率和高性能的数据库访问设计的,改编成一个简单的 Python 域语言的完整套件”。它采用了数据映射模式(像 Java 中的 Hibernate)而不是 Active Record 模式(像Ruby on Rails 的 ORM)。
SQLAlchemy官网。
SQLAlchemy 的优缺点:
优点:
企业级 API,使得代码有健壮性和适应性。 灵活的设计,使得能轻松完成复杂的数据查询。缺点:
工作单元概念不常见。 重量级 API,导致长学习曲线。SQLAlchemy 应用
以下是一段使用 SQLAlchemy 操作 SQLite 数据库的代码
# -*- coding:utf-8 -*-from sqlalchemy import ( create_engine, Column, Integer, String,)from sqlalchemy.ext.declarative import declarative_basefrom sqlalchemy.orm import sessionmakerengine = create_engine('sqlite:///./sqlalchemy.sqlite', echo=True)Base = declarative_base()class User(Base): __tablename__ = 'users' id = Column(Integer, primary_key=True, autoincrement=True) name = Column(String) fullname = Column(String) nickname = Column(String) def __repr__(self): return "<User(name='%s', fullname='%s', nickname='%s')>" % (self.name, self.fullname, self.nickname)db_session = sessionmaker(bind=engine)session = db_session()Base.metadata.create_all(engine)user1 = User(name='ed', fullname='Ed Jones', nickname='edsnickname')user2 = User(name='wendy', fullname='Wendy Williams', nickname='windy')user3 = User(name='mary', fullname='Mary Contrary', nickname='mary')session.add(user1)session.add(user2)session.add(user3)session.commit()user = session.query(User).filter(User.id<2).all()print(user)user = session.query(User).filter(User.id<=5).all()print(user)user1.name = 'admin'session.merge(user1)user4 = User(name='fred', fullname='Fred Flintstone', nickname='freddy')session.merge(user4)session.query(User).filter(User.id==2).update({'name':'test'})user = session.query(User).filter(User.id<=5).all()print(user)
新闻热点
疑难解答