sqlalchemy 执行原生sql语句
from contextlib import contextmanager
from sqlalchemy import create_engine, ForeignKey
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String
from sqlalchemy.orm import relationship, scoped_session
from sqlalchemy.orm import sessionmaker def create_session(engine):
"""封装Session创建过程 此函数只在应用初始化时调用一次即可""" # 创建Session工厂 SessionFactory()就可以创建出session对象, 但是该对象没有实现线程隔离
SessionFactory = sessionmaker(bind=engine) # 生成线程隔离的session对象(每个线程取自己的session)
session = scoped_session(SessionFactory)
# ps: 其实返回的session是scoped_session类型对象, 再通过session()才会创建Session对象, 不过scoped_session实现了代理功能, 进行数据操作时, 会自动创建/获取实现了线程隔离的Session对象并执行操作 return session # 创建模型基类
Base = declarative_base() # 创建数据库引擎
# 细节1 sqlalchemy默认实现了连接池功能, 并且可以自动重连(pool_size 连接池中的连接数, max_overflow 超出连接池的额外连接数)
# 细节2 如果数据库使用utf-8支持中文, 则设置连接地址时需要标明 ?charset=utf8 否则报错
engine = create_engine('mysql://root:mysql@127.0.0.1:3306/test27?charset=utf8', echo=False, pool_size=5, max_overflow=10) # 创建会话
session = create_session(engine) class User(Base):
__tablename__ = 't_user'
id = Column(Integer, primary_key=True)
name = Column(String(20), unique=True)
addresses = relationship('Address') class Address(Base):
__tablename__ = 't_address'
id = Column(Integer, primary_key=True)
detail = Column(String(20))
user_id = Column(Integer, ForeignKey('t_user.id')) @contextmanager # 装饰器形式的上下文管理器
def session_scope():
"""使用上下文管理器对session和事务操作进行封装"""
try:
yield session
session.commit()
except:
session.rollback()
raise
finally:
session.remove() # session工作完成, 销毁session, 释放内存 def index():
"""模拟视图函数""" with session_scope() as session: # 获取session对象, 代码块执行完会自动提交 并 销毁session
"""增加数据"""
user1 = User(name='zs')
session.add(user1)
session.flush() adr1 = Address(detail="中关村3号", user_id=user1.id)
adr2 = Address(detail="华强北5号", user_id=user1.id)
session.add_all([adr1, adr2]) """查询数据"""
# ret = session.query(User, Address).join(Address, User.id == Address.user_id).filter(User.name == 'zs').all()
# for user, adr in ret:
# print(user.name, adr.detail) """执行原生SQL"""
# data = session.execute('select * from t_user')
# print(type(data))
# row = data.fetchone() # 取第一条
# print(row.id) # 取主键
# print(row.name) # 取字段 # rows = data.fetchall() # 取所有数据
# for row in rows:
# print(row.id, row.name) # print(data.rowcount) # 取条数 if __name__ == '__main__':
# 删除所有表
Base.metadata.drop_all(engine)
# 创建所有表
Base.metadata.create_all(engine) index()
注释:模型类自己定义,继承生成的基类
sqlalchemy 执行原生sql语句的更多相关文章
- orm分组,聚合查询,执行原生sql语句
from django.db.models import Avg from app01 import models annotate:(聚合查询) ret=models.Article.objects ...
- django系列5.4--ORM中执行原生SQL语句, Python脚本中调用django环境
ORM执行原生sql语句 在模型查询API不够用的情况下,我们还可以使用原始的SQL语句进行查询. Django 提供两种方法使用原始SQL进行查询:一种是使用raw()方法,进行原始SQL查询并返回 ...
- 2016/05/13 thinkphp 3.2.2 ① 数据删除及执行原生sql语句 ②表单验证
[数据删除及执行原生sql语句] delete() 返回受影响的记录条数 $goods -> delete(30); 删除主键值等于30的记录信息 $goods -> delete( ...
- java:Hibernate框架3(使用Myeclipse逆向工程生成实体和配置信息,hql语句各种查询(使用hibernate执行原生SQL语句,占位符和命名参数,封装Vo查询多个属性,聚合函数,链接查询,命名查询),Criteria)
1.使用Myeclipse逆向工程生成实体和配置信息: 步骤1:配置MyEclipse Database Explorer: 步骤2:为项目添加hibernate的依赖: 此处打开后,点击next进入 ...
- Django中执行原生SQL语句【新编辑】
参考我的个人博客 这部分迁移到了个人博客中:Django中执行原生SQL语句 这里需要补充一下,还有一个extra方法: ret = models.Student.objects.all().extr ...
- thinkPHP框架中执行原生SQL语句的方法
这篇文章主要介绍了thinkPHP框架中执行原生SQL语句的方法,结合实例形式分析了thinkPHP中执行原生SQL语句的相关操作技巧,并简单分析了query与execute方法的使用区别,需要的朋友 ...
- Django之ORM执行原生sql语句
django中的ORM提供的操作功能有限,在模型提供的查询API不能满足实际工作需要时,可以在ORM中直接执行原生sql语句. Django 提供两种方法使用原生SQL进行查询:一种是使用raw()方 ...
- 执行原生SQL语句的方式
原生sql语句 cursor方法:from api.models import *from django.db import connection,connectionscursor=connecti ...
- laravel 跨库执行原生 sql 语句
执行原生 sql 返回结果集
随机推荐
- C语言I作业10
问题 回答 这个作业属于哪个课程 C语言程序设计II 这个作业要求在哪里 https://edu.cnblogs.com/campus/zswxy/SE2019-2/homework/10100 我在 ...
- 小白的springboot之路(六)、跨域解决方案CORS
0-前言 前后端分离.分布式集群,经常都会涉及到跨域访问,而浏览器基于同源策略,正常情况下是不能跨域的,这就需要我们解决跨域访问问题:spring boot解决跨域也比较简单: 1-CORS跨域解决方 ...
- css优先级 中文版MDN补充翻译
原文地址:https://developer.mozilla.org/zh-CN/docs/Web/CSS/Specificity css的MDN中文版,这一页是讲css的优先级的. 读到文章的最后, ...
- Yii2 负载均衡找不到JS,CSS
在部署项目的时候,用了2台服务器.请求的时候用了负载均衡,导致 YII2 的静态文件(js,css...)报 404 ,原因是: 请求一个页面时 A服务器 去处理,但是静态资源缺请求到了 B服务器 , ...
- css练习——两列左窄右kuan型
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- F#周报2019年第49期
新闻 宣告.NET Core 3.1 新书:Kevin Avignon的F#提升效率 .NET Core 2.2将在2019年12月23日迎来终结 Visual Studio 16.5预览版1中升级了 ...
- 免费试用 | 多模 NoSQL 服务GeminiDB for Cassandra 全球首发
PS:多模NoSQL服务GeminiDB重磅公测,免费体验,参与公测还有华为AI音响好礼相送~ 7月5日,华为云多模 NoSQL 服务GeminiDB for Cassandra正式对外定向邀测.华为 ...
- vue 常用的官网
vue.js https://cn.vuejs.org/ v-charts https://v-charts.js.org/#/ (图表,地图) web ...
- 设计模式GOF23(行为型模式)
场景: – 公司里面,报销个单据需要经过流程: • 申请人填单申请,申请给经理 • 小于1000,经理审查. • 超过1000,交给总经理审批. • 总经理审批通过 – 公司里面,请假条的审批过程: ...
- Spring整合Shiro 权限 角色 用户关系分析
Spring整合Shiro 权限 角色 用户关系分析 作者 : Stanley 罗昊 [转载请注明出处和署名,谢谢!] 前置内容 之前我们学习了,使用注解的方式去完成权限的控制,当然,也是静态的,也就 ...