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语句的更多相关文章

  1. orm分组,聚合查询,执行原生sql语句

    from django.db.models import Avg from app01 import models annotate:(聚合查询) ret=models.Article.objects ...

  2. django系列5.4--ORM中执行原生SQL语句, Python脚本中调用django环境

    ORM执行原生sql语句 在模型查询API不够用的情况下,我们还可以使用原始的SQL语句进行查询. Django 提供两种方法使用原始SQL进行查询:一种是使用raw()方法,进行原始SQL查询并返回 ...

  3. 2016/05/13 thinkphp 3.2.2 ① 数据删除及执行原生sql语句 ②表单验证

    [数据删除及执行原生sql语句] delete()  返回受影响的记录条数 $goods -> delete(30);   删除主键值等于30的记录信息 $goods -> delete( ...

  4. java:Hibernate框架3(使用Myeclipse逆向工程生成实体和配置信息,hql语句各种查询(使用hibernate执行原生SQL语句,占位符和命名参数,封装Vo查询多个属性,聚合函数,链接查询,命名查询),Criteria)

    1.使用Myeclipse逆向工程生成实体和配置信息: 步骤1:配置MyEclipse Database Explorer: 步骤2:为项目添加hibernate的依赖: 此处打开后,点击next进入 ...

  5. Django中执行原生SQL语句【新编辑】

    参考我的个人博客 这部分迁移到了个人博客中:Django中执行原生SQL语句 这里需要补充一下,还有一个extra方法: ret = models.Student.objects.all().extr ...

  6. thinkPHP框架中执行原生SQL语句的方法

    这篇文章主要介绍了thinkPHP框架中执行原生SQL语句的方法,结合实例形式分析了thinkPHP中执行原生SQL语句的相关操作技巧,并简单分析了query与execute方法的使用区别,需要的朋友 ...

  7. Django之ORM执行原生sql语句

    django中的ORM提供的操作功能有限,在模型提供的查询API不能满足实际工作需要时,可以在ORM中直接执行原生sql语句. Django 提供两种方法使用原生SQL进行查询:一种是使用raw()方 ...

  8. 执行原生SQL语句的方式

    原生sql语句 cursor方法:from api.models import *from django.db import connection,connectionscursor=connecti ...

  9. laravel 跨库执行原生 sql 语句

    执行原生 sql 返回结果集

随机推荐

  1. R 语言学习笔记(1)——R 工作空间与输入输出

    什么是工作空间? 工作空间(workspace)就是当前 R 的工作环境,它储存着所有用户定义的对象(objectives)包括了向量.矩阵.函数.数据框.列表等. 处理 R 文件的工作流程 #设置当 ...

  2. IDEA 更改提示一键补全快捷键

    偏好设置-->KeyMap-->用关键字搜索可以用下面图中的任意词只要能定位到就是可以的 (Choose Lookup Item Replace)然后增加想用的键,个人喜欢直接加一个空格

  3. 有奖投票丨HC2019开发者关注的TOP10问题你最想听哪个?

    目前,人工智能已经成为广大开发者重点关注的技术领域.然而,随着人工智能技术的快速发展,AI应用场景复杂度在与日俱增,算法调教也亟需不断成熟,这些都为开发者们带来了更多全新的挑战.如何快速把握前沿技术的 ...

  4. CSS给元素清除浮动影响的方法,--最全四种方法

    代码实例: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...

  5. 一道时间复杂度为O(N)空间复杂度为O(1)的排序问题

    题目:对1, 2, ... , n的一个无序数组,排序,要求时间复杂度为O(N),空间复杂度为O(1). 思路:该题利用数组元素和数组下标相差1的关系,Java代码如下: import java.ut ...

  6. 《手把手教你》系列进阶篇之2-python+ selenium自动化测试 - python基础扫盲(详细教程)

    1. 简介 这篇文章主要是分享讲解一下,如何封装自己用到的方法和类.以便方便自己和别人的调用,这样就可以避免重复地再造轮子. 封装(Encapsulation)是面向对象的三大特征之一(另外两个是继承 ...

  7. iOS FMDatabase 本地数据库的创建和几个基本使用方法

    转自:http://blog.it985.com/3677.html 使用数据库之前当然要先在网上下载FMDB的库,然后添加到自己的工程里面去.没有的请点击下面的来下载 fmdb 在FrameWork ...

  8. MVC参数传递

    MVC参数传递 请求参数自动类型转换 JSP页面 form class="loginForm" action="/user/getUser" method=&q ...

  9. (全国多校重现赛一)A-Big Binary Tree

    You are given a complete binary tree with n nodes. The root node is numbered 1, and node x's father ...

  10. [golang] nats的消息传递模型介绍

    目录 nats的消息传递模型 What is NATS 主题式消息(Subject-Based Messaging) 发布订阅(Publish-Subscribe) 请求应答(Request-Repl ...