SQLAlchemy操作MariaDB笔记之二

回顾创建表格的代码:

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()

你可能感兴趣的:(mysql,DB,sqlalchemy,maria)