下面根据文档中的基于对象的教程(Object Relational Tutorial)进行学习。
(1)版本检验(我这里使用的是Python 2.7.5)
<pre name="code" class="python">
<span style="font-size:18px;">>>> import sqlalchemy
>>> sqlalchemy.__version__</span>
<span style="font-size:18px;">'1.0.4'</span>
(2)连接
这里我们使用的是内嵌数据库SQLite,通过create_engine()来进行连接。
>>> from sqlalchemy import create_engine
>>> enginge = create_engine('sqlite:///:memory:', echo=True)
其中通过设置echo来启动sqlalchemy的日志记录,而sqlalchemy的日志记录是基于Python自带的标准logging模块完成的。通过设置echo为True,可以看到所有的操作过程产生的SQL。
create_engine()返回的是一个Engine的实例,它代表了数据库的核心接口,并且对不同的数据库厂商语言进行差异化处理。
(3)声明映射
在ORM中,一般是先讨论所需要的表,然后再定义类来跟表进行映射,而在sqlAlchemy中,这两项任务是同时完成的,即在创建类的同时,对将要进行映射的数据库表进行描述。
>>> from sqlalchemy.ext.declarative import declarative_base
>>> Base = declarative_base()
在Base的基础上,我们就可以进行新类的创建了。
>>> class User(Base):
__tablename__ = 'users'
id = Column(Integer,primary_key = True)
name = Column(String)
fullname = Column(String)
password = Column(String)
def __repr__(self):
return "<User(name='%s', fullname='%s', password='%s')>" % (self.name, self.fullname, self.password)
__repr__()函数是为了让实例输出时更加标准化和美观一些,并不是必须的。
通过输入 User.__table__ 就可以看到将要创建的表的样子。
>>> User.__table__
Table('users', MetaData(bind=None), Column('id', Integer(), table=<users>, primary_key=True, nullable=False), Column('name', String(), table=<users>), Column('fullname', String(), table=<users>), Column('password', String(), table=<users>), schema=None)
在这里观察可以发现,在创建表时,VARCHAR列没有设置长度,这在SQLite和Postgresql中是被允许的,涉及其他数据库时,请事先声明长度,类似Column(String(30))。如需要设定Sequence(Oracle和Firebird),需要如下设定。
from sqlalchemy import Sequence
Column(Integer, Sequence('user_id_seq'), primary_key=True)
(4)创建映射类的实例
当完成映射后,尝试创建映射类的实例。
>>> ed_user = User(name='ed', fullname='Ed Jones', password='edspassword')
>>> ed_user.name
'ed'
>>> ed_user.password
'edspassword'
>>> str(ed_user.id)
'None'