SQLAchemy 学习(1)

SQLAchemy 是Python操纵数据库的一个常用的第三方ORM框架,我将通过几篇文章总结一下对SQLAlchemy的学习。

ORM

ORM全称是Object-relational mapping,他将关系数据库中表中的记录映射成为对象,以对象的形式展现,程序员可以把对数据库的操作转化为对对象的操作。
它的作用是在关系型数据库和业务实体对象之间作一个映射,这样,我们在具体的操作业务对象的时候,就不需要再去和复杂的SQL语句打交道,只要像平时操作对象一样操作它就可以了。
因此ORM的目的是为了方便开发人员以面向对象的思想来实现对数据库的操作。

python中最流行的ORM库就是SQLAlchemy

SQLAchemy 架构

SQLAcheemy两个层次的关系图

SQLAchemy方言系统核心类的关系图

Connecting

通过create_engine()方法创建一个Engine对象实现连接:engine = create_engine("mysql://scott:tiger@hostname/dbname",encoding='latin1', echo=True)
数据库URL的格式为:dialect[+driver]://user:password@host/dbname[?key=value..],其中dialect为使用的数据库名字,driver为驱动器(比如说mysql的pymysql或者psycopg2)

Declare a Mapping(声明映射)

我们要定义关系类的时候要依据一个基类,这个基类是维系类和数据表关系的目录,我们使用declarative_base()函数创建基类,
如下:

1
2
3
>>> from sqlalchemy.ext.declarative import declarative_base
>>> Base = declarative_base()

后面所有定义的映射的类将继承这个类进行创建

Create a Schema(创建模式)

我们可以通过定义映射类类来创建相关的模式(ORM的特点),比如:

1
2
3
4
5
6
7
8
9
10
class User(Base):
__tablename__ = 'users'
id = Column(Integer, Sequence('user_id_seq'), primary_key=True)
name = Column(String(50))
fullname = Column(String(50))
password = Column(String(12))
def __repr__(self):
return "<User(name='%s', fullname='%s', password='%s')>" % (
self.name, self.fullname, self.password)

Create an Instance of the Mapped Class

实例化一个映射类,同样也支持使用init()方法进行构造

1
2
3
4
5
6
7
>>> ed_user = User(name='ed', fullname='Ed Jones', password='edspassword')
>>> ed_user.name
'ed'
>>> ed_user.password
'edspassword'
>>> str(ed_user.id)
'None'

Adding and Updating Objects

通过Session和数据库进行对话,通过sessionmaker() 利用之前创建的Engine上创建一个会话类,每次进行修改的时候都要由这个类生成一个实例:

1
2
3
>>> from sqlalchemy.orm import sessionmaker
>>> Session = sessionmaker(bind=engine)
>>> session = Session()

我们对对象进行修改以后,通过创建的这个session实例对象来进行提交

1
2
>>> ed_user = User(name='ed', fullname='Ed Jones', password='edspassword')
>>> session.add(ed_user)

Querying

Query通过Session中的query()方法:

1
2
3
4
5
6
>>> for instance in session.query(User).order_by(User.id):
... print(instance.name, instance.fullname)
ed Ed Jones
wendy Wendy Williams
mary Mary Contrary
fred Fred Flinstone

Query提供多种筛选filter操作,在数据库中的相关基本运算

常用的一些方法

  • Base.metadata.create_all(engine) 常用于正常使用的时候创建表,自动建立表结构。优点是省时;缺点是风险高,只有在内测环境且数据量已经备份的前提下方可使用。是一种修改表结构的方法,但是风险比较高。还可以使用其他的库(如openstack/sqlalchemy-migrate)