SQLAlchemy简介及在OpenStack中的使用

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
apt-get 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"
engine = create_engine(engine_str, echo=True)
conn = engine.connect()

Metadata

Table objects and its children as metadata Table Column(String, Integer…)
Create tables within the engine

Insert expression

ins2=users.insert() #anexpression
result2 = conn.execute(ins2, id=2, name=’wendy’, fullname=’Wendy Williams’) # execute
Multiple inserts: conn.execute(ins2, a_list)

Update

users.update().values({…}).where(…)

Delete

同上

Select

s = select([users]) or s = users.select()
result = conn.execute(s)
result.fetchone()
result.close()

text

sqlalchemy allows using string
s = text(“””Hello”””)

orm方式

Declare a Mapping

declarative_base: define classes and mapping to tables

Base = declarative_base()
class User(Base):
__tablename__ = ‘users’
...

MetaData

Base.metadata.create_all(engine)

Session

事务
using session to handle orm’s action

Session = sessionmaker(bind=engine)
session = Session()

Connection pool

Add(insert)

ed_user = User('ed', 'Ed Jones', 'edspassword')
session.add(ed_user)
session.add_all([...])
session.commit()

Query

result = session.query(User).filter(User.name==‘ed')
result[0].name, result[0][0]

Relationship

class Address(Base)
__tablename__ = ‘addresses’
...
user_id = Column(Integer, ForeignKey('users.id')) user = relationship("User",
backref=backref('addresses', order_by=id))

迁移

Alembic
参考

OpenStack中的使用

wsgi框架+SQLAlchemy

问题

版本兼容问题
rpmbuild

参考索引