SQLAlchemy操作MariaDB笔记之二

本文记录了使用SQLAlchemy操作MariaDB的过程,包括创建表格、插入数据、查询、更新和回滚操作。通过Session进行数据库操作,强调了 flush 和 commit 的作用,以及如何批量添加和修改数据。

回顾创建表格的代码:

from sqlalchemy import create_engine
from sqlalchemy import String, Integer, Column
from sqlalchemy.ext.declarative import declarative_base
#声明Maria引擎
engine = create_engine("mysql://root:mypassword@192.168.0.31/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()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值