Python库之SQLAlchemy (2)

update()方法和前面的insert()方法很相似,它们的语法几乎完全一样,但是update()可以指定一个where()子句,用来指出要更新哪些行。

from sqlalchemy import update u = update(user).where(user.c.name == '小明') u = u.values(name='小华') result = connection.execute(u) print(result.rowcount) 2.4、删除数据

创建删除语句时,既可以使用delete()函数,也可以使用表的delete()方法。与insert()和update()不同,delete()不接收值参数,只接收一个可选where子句,用来指定删除范文。

from sqlalchemy import delete u = delete(user).where(user.c.name == '小华') result = connection.execute(u) print(result.rowcount)

注意:

更多的高级操作:连接、别名、分组、链式调用、原始查询等,请查阅官方文档。

2.5、事务

通过connection.begin()开启一个事务,返回一个transaction对象,接下来根据执行的情况调用transaction.commit()提交修改或者调用transaction.rollback()回滚操作。

三、SQLAlchemy orm

SQLAlchemy orm定义表结构使用的是1.5中说的第2种方式。通过定义一个类,它继承自一个名为declarative_base的特殊基类。declarative_base把元数据容器和映射器(用来把类映射到数据表)结合在一起。

orm使用的类应该满足如下四个要求:

继承自declarative_base对象。

包含__tablename__,这是数据库中使用的表名。

包含一个或多个属性,它们都是column对象。

确保一个或多个属性组成主键。

3.1、定义表结构: from sqlalchemy import create_engine from sqlalchemy import Column from sqlalchemy import Integer from sqlalchemy import String from sqlalchemy.ext.declarative import declarative_base Base = declarative_base() class User(Base): __tablename__ = 'user' id = Column(Integer, primary_key=True) name = Column(String(255)) engine = create_engine('sqlite:///') Base.metadata.create_all(engine) Session = sessionmaker(bind=engine) session = Session() 3.2、会话(session)

会话是SQLAlchemy ORM和数据库交互的方式。它通过引擎包装数据库连接,并为通过会话加载或与会话关联的对象提供标识映射(identity map)。标识映射是一种类似于缓存的数据结构,它包含由对象表和主键确定的一个唯一的对象列表。会话还包装了一个事务,这个事务将一直保持打开状态,直到会话提交或回滚。

为创建会话,SQLAlchemy提供了一个sessionmaker类,这个类可以确保在整个应用程序中能够使用相同的参数创建会话。sessionmaker类通过创建一个Session类来实现这一点,Session类是根据传递给sessionmaker工厂的参数配置的。

from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker engine = create_engine('sqlite:///:memory:') Session = sessionmaker(bind=engine) session = Session() 3.2、插入 user = User(1, '小明') session.add(user) session.commit() 3.3、查询 for row in session.query(User): print(row.id, row.name)

注意:session.query()的返回值是Query对象,不能使用它的返回值作为查询结果。关于Query对象的用法,请参阅:

常用Query对象的方法:

q = session.query(User) q.count() # 获取查询结果的数量 q.all() # 返回查询结果的list,会触发执行SQL查询 q.get(id) # 根据primary_key查询单个对象 q.as_scalar() # 返回此次查询的SQL语句 3.3.1、控制查询中的列数 print(session.query(user.name).first()) 3.3.2、排序 for record in sesssion.query(user).order_by(user.name): print(user.name) 3.3.3、限制返回结果集的条数 query = session.query(user).order_by(user.name).[:2] print([result.user_name for result in query]) 3.3.4、内置SQL函数和标签 from sqlalchemy import func inv_count = session.query(func.sum(user.name)).scalar() print(inv_count) 3.3.5、过滤 record = session.query(user).filter(user.name == '小华') print(record) 3.4、更新数据 query = session.query(user) xm_user = query.filter(user.user_name == '小华').first() xm_user.name = 'robin' session.commit() print(xm_user.quantity) 3.5、删除数据 query = session.query(user) xm_user = query.filter(user.user_name == '小华').first() session.delete(xm_user) session.commit() print(xm_user)

注意:

这里简单介绍了SQLAlchemy orm的常见用法,更高级的用法请查阅官方文档。

四、反射

使用反射技术可以利用先用数据库填充SQLAlchemy对象。

4.1、反射单个表

创建初始对象:

from sqlalchemy import Metadata, create_engines metadata = MetaData() engine = reate_engine('sqlite:///')

反射Artist表

from sqlalchmy impport Table artist = Table('Artist', metadata, autoload=True, autoload_with=engine) 4.2、反射整个数据库 metadata.reflect(bind=engine) 参考资料

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpsgpz.html