SQLAlchemy的ORM方式将数据库中的记录映射成了我们定义好的模型类,但是带来一个问题是,这些类对象的实例只在数据库会话(session)的生命期内有效,假如我将数据库会话关闭了,再访问数据表类的对象就会报错。

如下面这段简单的示例代码:

from sqlalchemy import create_engine

from sqlalchemy.orm import sessionmaker

from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()

class User(Base):

__tablename__ = 'USER'

id = Column(Integer, Sequence('USER_SEQ'), primary_key=True, autoincrement=True)

name = Column(String(30))

age = Column(Integer)

status = Column(String(30))

engine = create_engine(str(db_url), encoding=b'utf-8', echo=echo, convert_unicode=True)

Session = sessionmaker(bind=engine)

session = Session()

user = User(name='John', age=30)

session.add(user)

session.commit()

session.close()

print user.name

运行到最后一行会抛出异常:

Traceback (most recent call last):

File "E:\WorkCopy\test\test.py", line 21, in test_something

print user.name

File "C:\Python27\lib\site-packages\sqlalchemy\orm\attributes.py", line 237, in __get__

return self.impl.get(instance_state(instance), dict_)

File "C:\Python27\lib\site-packages\sqlalchemy\orm\attributes.py", line 573, in get

value = state._load_expired(state, passive)

File "C:\Python27\lib\site-packages\sqlalchemy\orm\state.py", line 480, in _load_expired

self.manager.deferred_scalar_loader(self, toload)

File "C:\Python27\lib\site-packages\sqlalchemy\orm\loading.py", line 610, in load_scalar_attributes

(state_str(state)))

DetachedInstanceError: Instance is not bound to a Session; attribute refresh operation cannot proceed

可能有的人会说,那你不要关闭数据库会话呀,会话关闭了对象当然就无法访问了,因为ORM需要跟踪这个对象,并缓存一些你对它的操作以便在需要时更新到数据库去的,它不是一个简单的对象。

但我现在的需求是:从数据库中查询得到了一个对象实例之后,就想让这个对象与数据库切断联系,SQLAlchemy有提供这样的方法吗?我必须定义一个具有同样成员的类然后再初始化它?

回答

后记:貌似 session.expunge() 就是做这个的。

user = User(name='John', age=30)

session.add(user)

session.commit()

session.refresh(user)

session.expunge(user)

session.close()

print user.name

使用 session.refresh(user) 是为了读取自增字段值(如果有的话)到 user 对象。

try:

session.add(app)

session.commit()

session.close()

return user.name

except:

return None

finally:

session.close

执行user.name时,会查询一次数据库,所以不能在这之前关掉session

sql怎样与python联系_【Python】SQLAlchemy的数据对象实例能否转为一个简单的对象(切断与数据库会话的联系)...相关推荐

  1. mysql python插件_基于SQLAlchemy连接mysql库(pymsql插件)

    # -*- coding:UTF -8-*-import osimport pandas as pd# 检查是否有pymysql这个包存在import pymysql# SQLAlchemy本身无法操 ...

  2. python数据模型_#PYTHON#数据模型 | 学步园

    今天,谈谈python中的数据模型,当然你可以不了解这些东西,照样可以写出漂亮的python代码,但是"知其然知其所以然"是我的作风,总是不明白python的一些机制,心里很不爽. ...

  3. 初识python 视频_#python day02 初识python 学习视频来源于 太白金星

    #python day02 初识python 学习视频来源于 太白金星 ''' 知识点:安装PyCharm''' # 设置鼠标条件字体大小:file ->settings # 搜索mouse E ...

  4. python源码编译 带tkinter_python通过Tkinter库实现的一个简单的文本编辑器源码

    下边资料是关于python通过Tkinter库实现的一个简单的文本编辑器的内容. from tkSimpleDialog import askstring from tkFileDialog impo ...

  5. 《Python Cookbook 3rd》笔记(2.19):实现一个简单的递归下降分析器

    实现一个简单的递归下降分析器 问题 你想根据一组语法规则解析文本并执行命令,或者构造一个代表输入的抽象语法树.如果语法非常简单,你可以自己写这个解析器,而不是使用一些框架. 解法 在这个问题中,我们集 ...

  6. python运行不了程序代码_Python源码分析2 - 一个简单的Python程序的执行

    本文主要通过跟踪一个非常简单的Python程序的执行,简单讨论Python实现的基本框架和结构. 要执行Python程序如下,功能非常简单:从1加到10再打印出来 # test program sum ...

  7. python json操作_Python读取JSON数据操作实例解析

    读写 JSON 数据 问题 你想读写 JSON(JavaScript Object Notation) 编码格式的数据. 解决方案 json模块提供给了一种很简单的方式来编码和解码json数据,其中两 ...

  8. ios php mysql实例_如何用PHP/MySQL为 iOS App 写一个简单的web服务器(译) PART1

    原文:http://www.raywenderlich.com/2941/how-to-write-a-simple-phpmysql-web-service-for-an-ios-app 作为一个i ...

  9. 数据库和python有关系吗_想问一下,数据跟代码种类有关系么? 比如我用MySQL数据库,必须要用python或者JAVA之类的要求...

    你可以访问python数据库接口及api查看详细的支持数据库列表.不同的数据库你需要下载不同的db api模块,例如你需要访问oracle数据库和mysql数据,你需要下载oracle和mysql数据 ...

  10. 黑马程序员python笔记_#华为云·寻找黑马程序员# 如何实现一个优雅的Python的Json序列化库...

    [小宅按]在Python的世界里,将一个对象以json格式进行序列化或反序列化一直是一个问题.Python标准库里面提供了json序列化的工具,我们可以简单的用json.dumps来将一个对象序列化. ...

最新文章

  1. 把握每天的第一个钟头
  2. 简单介绍Lua中的变量与赋值方法
  3. 腾讯张正友:计算机视觉的三生三世
  4. BCH综述:数以百万计的商人,更多的代币和冲突的愿景
  5. python学习 day2 (3月2日)
  6. ./configure: error: the HTTP rewrite module requires the PCRE library
  7. 初步学习Linux文件基本属性和Cygwin STATUS_ACCESS_VIOLATION 错误
  8. CVPR 2015 papers
  9. 1.10 比较两个数组是否相等(equals())
  10. ZedGraph怎样在生成曲线时随机生成不一样的颜色
  11. 如何用Linux写c程序并编译运行
  12. boost::contract模块实现access的测试程序
  13. html div百分比计算,css计算元素百分比大小
  14. html隐藏并失效,如果元素开始隐藏,css过渡将不起作用
  15. Linux关闭开启防火墙命令
  16. enum python_python 枚举Enum
  17. 【ANT】输入中文格式为乱码
  18. c语言中函数的递归调用,用C语言函数调用与递归解决问题
  19. 将ppt里的图片高分辨率保存的方法
  20. PHP根据经纬度计算距离

热门文章

  1. matlab 球体的绘制 柱面坐标系法 球面坐标系法
  2. Opencv之threshold
  3. 2011-7-3北京李庄儿童医院看病记
  4. Linux修改open files数及ulimit和file-max的区别
  5. FBEC2020 | 贾瑶琪:打造区块链项目最好的方式,是打造开源的系统
  6. 滴滴征战澳洲 全球“追击”优步
  7. 人工智能学习:CS188
  8. Error invoking sqlprovider method (tk.mybatis.mapper.provider.base.BaseselectProvider.dynamicSQL)解决
  9. div、p、span标签如何做到首行缩进两个字符
  10. 玩转Redis-生产环境如何导入、导出及删除大量数据