1 连接

    sqlalchemy可以连接的数据库有:MySQL、SQLite、PostgreSQL。

 在连接之前,需要做些准备:创建用户账号、创建数据库以及给数据库权限,安装语言对应的第三方库,例如mysqldb等

from sqlalchemy import create_engine

db_user = 'test'
db_passwd = "123"
conn_string = 'mysql+mysqldb://' + db_user + ':' +db_passwd + '@localhost/kobesystem?charset=utf8'
engine = create_engine(conn_string, encoding='utf-8')
print engine

#Engine(mysql+mysqldb://kobe:***@localhost/kobesystem?charset=utf8)

2 声明映射

 使用ORM时,配置过程首先描述将要处理的数据库表,然后定义我们自己的类,将类映射到表中。

 使用Declarative系统映射的类是根据基类定义的,该基类维护相对于该基类的类和表的目录,这称为声明性基类,也称为元类。

from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()

我们自己定义的所有的类都要继承这个基类。在类中,主要是表明、以及列的名称和数据类型。

from sqlalchemy import Column, Integer, String

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)

3 创建架构

    User通过声明系统构建我们的类,定义了有关表的信息,称为表元数据。SQLAlchemy用于特定表的此信息的table对象称为对象。

    定义了User,此时在数据库中还没有创建这个表,只有通过metadata.create_all()方法,将engine作为数据库连接源连接,然后再去执行其他已经申明的动作。

Base.metadata.create_all(engine)

4 创建映射类的实例

    完成映射后,来创建并检查下User对象。

>>> ed_user = User(name='ed', fullname='Ed Jones', password='edspassword')
>>> ed_user.name
'ed'
>>> ed_user.password
'edspassword'
>>> str(ed_user.id)
'None'

 尽管没有在构造函数中指定它,但是当访问它时,该id属性仍会产生一个值None

5 创建会话

  搞了这么多,才开始与数据库交谈。ORM对数据库的处理是session。当我们第一次设置应用程序时,定义了一个session类,它作为新session对象的工厂。

from sqlalchemy.orm import sessionmaker

session = sessionmaker(bind=engine)

实例化session后,可以通过session对数据库进行间接操作,最后还必须将会话提交后,才生效。

 

6 添加和跟新对象

 通过使用add()方法,可以添加表内容。

ed_user = User(name='ed',fullname='Ed Jones',password='123')
session.add(ed_user)

  通过add_all() 方法,可以一次添加对个对象。

>>> session.add_all([
...     User(name='wendy', fullname='Wendy Williams', password='foobar'),
...     User(name='mary', fullname='Mary Contrary', password='xxg527'),
...     User(name='fred', fullname='Fred Flinstone', password='blah')])

最后需要将会话提交,session.commit()

commit()刷新对数据库的剩余的更改,并提交事务。该会话引用的连接资源现在返回到连接池。此会话的后续操作将在新事务中进行,该事务将在首次需要时再次重新连接资源。

 

事事有回音 凡事有交代 件件有着落