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()刷新对数据库的剩余的更改,并提交事务。该会话引用的连接资源现在返回到连接池。此会话的后续操作将在新事务中进行,该事务将在首次需要时再次重新连接资源。
事事有回音 凡事有交代 件件有着落