SQLAlchemy是Python编程语言下的一款开源软件,提供了SQL工具包及对象关系映射(ORM)工具。
web编程之orm
在编写web服务时,我们通常使用orm,而不是直接使用SQL与数据库进行交互。
如果使用Django等比较全面的框架,可以选择默认的ORM。但如果选择flask等轻量级框架,则需要自己选择ORM。同时,自己选择使用ORM也带来了更大的灵活性。
orm是什么
以下节选自wikipeida:
Object-relational mapping (ORM, O/RM, and O/R mapping tool) in computer science is a programming technique for converting data between incompatible type systems in object-oriented programming languages.
以下节选自百度百科:
对象关系映射(英语:Object Relation Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换。
实际项目中,我们主要使用orm作为与数据库等进行实际交互的工具。
为什么使用orm
与直接使用sql访问数据库相比,其有以下好处:
- 代码的简洁性,对存储层的通用封装
使用orm,操作数据库往往仅需要简单的几条语句,使代码变得简洁。 - 数据源的兼容性
orm往往对多种数据库、数据源进行通用的封装,从而使得编写一套代码,适用于不同的数据源变得可能。 - 操作的安全性
直接使用sql操作数据库,往往会因为开发人员疏忽引入sql注入等安全问题。而使用orm,能避免此问题。 - 操作语句的高效性
orm的封装是众多开发人员智慧的结晶,其中往往已经对生成的sql语句进行了优化,使得一般语句的性能比较高效,而开发人员不需要再去考虑性能问题。但orm一般是通用的解决方案,无法针对所有场景进行优化,特殊场景下其生成的sql语句可能会非常低效,因此需要在实际使用时进行监控并酌情优化。
简介及特性
SQLAlchemy的特性主要如下:
- Mature, High Performing Architecture DBA Approved
- Non-Opinionated
- Unit Of Work
- Function-based query construction Modular and Extensible
- Separate mapping and class design …
See: http://www.sqlalchemy.org/features.html
安装及使用
安装
开发环境推荐使用pip安装,同时注意版本问题。
pip install sqlalchemy |
生产环境推荐使用rpm/deb安装,同时注意版本问题。
rpm - 版本兼容问题
yum install SQLAlchemy |
使用
支持的2种方式:
- SQL Expression Language (core)
- Object Relational Mapper (orm)
Core方式
(raw sql、sql expression)
对于绝大多数应用, 推荐使用SqlAlchemy. 即使是使用raw sql,
SqlAlchemy 也可以带来如下好处:
- 内建数据库连接池
- 强大的log功能
SqlAlchemy的sql expression和raw sql的比较:
- sql expression 写法是纯python代码, 阅读性更好
- raw sql 比 sql expression 更灵活, 如果SQL很复杂, 更有优势了
Connect
engine_str = "mysql:mysql://root:root@localhost/django_sqla" |
Metadata
Table objects and its children as metadata Table Column(String, Integer…) |
Insert expression
ins2=users.insert() #anexpression |
Update
users.update().values({…}).where(…) |
Delete
同上
Select
s = select([users]) or s = users.select() |
text
sqlalchemy allows using string |
orm方式
Declare a Mapping
declarative_base: define classes and mapping to tables
Base = declarative_base() |
MetaData
Base.metadata.create_all(engine) |
Session
事务
using session to handle orm’s action
Session = sessionmaker(bind=engine) |
Connection pool
Add(insert)
ed_user = User('ed', 'Ed Jones', 'edspassword') |
Query
result = session.query(User).filter(User.name==‘ed') |
Relationship
class Address(Base) |
迁移
Alembic
参考
OpenStack中的使用
wsgi框架+SQLAlchemy
问题
版本兼容问题
rpmbuild