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 返回结果集
随机推荐
- 重新调用 layoutSubview
重新调用 layoutSubview
- 源码分析 RocketMQ DLedger 多副本之 Leader 选主
目录 1.DLedger关于选主的核心类图 1.1 DLedgerConfig 1.2 MemberState 1.3 raft协议相关 1.4 DLedgerRpcService 1.5 DLedg ...
- 常用torch代码片段合集
PyTorch常用代码段整理合集 本文代码基于 PyTorch 1.0 版本,需要用到以下包 import collections import os import shutil import tqd ...
- 【经验分享】如何搭建本地MQTT服务器(Windows ),并进行上下行调测
网上查了很多资料,实际动手的时候踩了很多坑,现在把我的经验分享给大家: 一.安装和启动 使用EMQTT,下载完直接到bin目录下执行emqttd start就可以了,简单方便 下载地址:https:/ ...
- 强化学习七 - Policy Gradient Methods
一.前言 之前我们讨论的所有问题都是先学习action value,再根据action value 来选择action(无论是根据greedy policy选择使得action value 最大的ac ...
- 最简单易懂的linux系统基础优化
第10章 linux的系统优化 10.1 系统的版本,内核查看 10.1.1 系统版本的查看 [root@oldboy6666 ~]# cat /etc/redhat-release CentOS L ...
- Python操作redis和mongoDB
一.操作redis redis是一个key-value存储系统,value的类型包括string(字符串),list(链表),set(集合),zset(有序集合),hash(哈希类型).为了保证效率, ...
- lede install unifi controller
requirement: sdb3 should be formated as ext4, DO not use f2fs/NTFS/exFAT. debootstrap --arch=amd64 s ...
- ansible部署apache
Ansible 配置Apache(加粗的字体是要执行的命令) 配置免密登录 [root@localhost ansible]# vim /etc/ansible/hosts //用来配置目标主机 加入 ...
- 用正则表达式【regexp】进行高级搜索数据
正则表达式介绍 正则表达式是用来匹配文本的特殊字符集合,如果你想从一个文本中提取电话号码而已使用正则表达式,如果你需要查找名字中包含数字的所有文件可以使用正则,如果你你要在文本块中找到所有重复的单词, ...