回顾创建表格的代码:
from sqlalchemy import create_engine
from sqlalchemy import String, Integer, Column
from sqlalchemy.ext.declarative import declarative_base
#声明Maria引擎
engine = create_engine("mysql://root:[email protected]/test", encoding="utf-8", echo=True)
Base = declarative_base()
#设定自增长主键
from sqlalchemy import Sequence
#User表的声明
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)
#操作MariaDB
Base.metadata.create_all(engine)
SQLAlchemy与MariaDB的通信机制是通过Session(会话)完成的。
特定会话的声明和创建必须依赖于create_engine()方法返回的engine对象。
有两种声明Session类,sessionmaker()是一个工厂方法。
1 直接
from sqlalchemy.orm import sessionmaker
Session = sessionmaker(bind=engine)
2 稍后
Session = sessionmaker()
Session.configure(bind=engine) # once engine is available
每次操作数据库都要有一个session对象
session=Session()
插入
ed_user = User(name='ed', fullname='Ed Jones', password='edspassword')
session.add(ed_user)
注意没有flush前这个插入操作是挂起的。真正的数据库修改操作需要执行:
session.flush()
session.commit()
查询:
our_user = session.query(User).filter_by(name='ed').first()
在SQLAlchemy的ORM机制中,our_user和ed_user会被映射成为一个对象,是is_a的关系。
>>> ed_user is our_user
True
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')])
更改表格行的某个字段,这里应该是先查询得到表格行对应的对象。
>>> ed_user.password = 'f8s7ccs'
挂起的脏数据
>>> session.dirty
IdentitySet([<User(name='ed', fullname='Ed Jones', password='f8s7ccs')>])
>>> session.new
IdentitySet([<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()
提交之后,再次执行ed_user.password
会发现,sqlalchemy会帮助我们重新查询数据库,并返回修改之后的结果。
回滚
回滚到上一次commit()之前
session.rollback()