sqlalchemy的查询遇到的问题

本文介绍了如何使用Python的SQLAlchemy ORM进行数据库连接查询,并提供了具体的代码示例。重点讲解了SessionContext和with语句结合使用的方法,以及如何通过连接查询获取多个相关对象。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用sqlalchemy查询。

首先介绍连接DB的方法:

这里最常用到的就是session_context或者SessionContext和with搭配使用。

#-*-coding:UTF-8-*-

__author__='zhaoxp'

import unittest
import time
import datetime
import contextlib
import traceback
import sqlalchemy
import sqlalchemy.orm

import sysmgt.sysconf as sysconf
#import models.hosts

from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base

from sysmgt.models import *
from sysmgt.ldap import get_LDAP_user_list
#import models.hosts

#from models.hosts import Base

#Base=models.hosts.Base # error
#Base=declarative_base()

dbecho=sysconf.get_property('db.echo').lower()=='true' and True or False

print('dbecho = '+str(dbecho))

engine=sqlalchemy.create_engine('mysql://%s:%s@%s/%s?charset=%s'%(sysconf.get_property('db.user'),
			sysconf.get_property('db.password'),sysconf.get_property('db.host'),
			sysconf.get_property('db.db'),sysconf.get_property('db.charset')),
			pool_recycle=28800,
			echo=dbecho)

def _get_DB_session():
	DBSession=sqlalchemy.orm.sessionmaker(bind=engine)
	return DBSession()


@contextlib.contextmanager
def session_context():
    try:
        DBSession=sqlalchemy.orm.sessionmaker(bind=engine)
        session=DBSession()
        yield session
    except BaseException as be:
    	print('session_context exception : '+str(be))
    	traceback.print_exc()
    finally:
    	#print('session_context close session')
        if session is not None:
            session.close()


class SessionContext(object):
    def __init__(self):
    	self._need_commit=False
    	self._session=None

    def __enter__(self):
    	try:
    		DBSession=sqlalchemy.orm.sessionmaker(bind=engine)
    		self._session=DBSession()
    	except:
    		print('SessionContext __enter__ exception:')
    		traceback.print_exc()
    	return self._session

    def __exit__(self,exec_type,exec_value,exec_traceback):
        try:
        	if self._session:
        		if self._need_commit:
        			self._session.commit()
        		self._session.close()
        except :
            print 'SessionContext Exception :'
            traceback.print_exc()


class SessionHolder(object):

    def __init__(self):
    	self._need_commit=False
    	self._session=None

    def __enter__(self):
    	try:
    		DBSession=sqlalchemy.orm.sessionmaker(bind=engine)
    		self._session=DBSession()
    	except:
    		print('SessionContext __enter__ exception:')
    		traceback.print_exc()
    	return self

    def get_session(self):
    	return self._session

    def set_commit(self,value):
    	self._need_commit=value

    def __exit__(self,exec_type,exec_value,exec_traceback):
        try:
        	if self._session:
        		if self._need_commit:
        			self._session.commit()
        		self._session.close()
        except :
            print 'SessionContext Exception :'
            traceback.print_exc()

关于通过查询获得对象:连接查询可以一次获得多个相互连接的对象,但是有个问题,这些对象并不能连接起来,例如UserGroupMapping和User关联,我们可以得到相关的两个对象,但是当访问User的usergroups属性时,session还需要重对UserGroupMapping新做查询。

a=session.query(SysID,Host,Auth).filter(SysID.id==Host.sysid_id).filter(Host.id==Auth.host_id).all()
sysid_set=set()
for sysid,host,auth in a:
    sysid_set.add(sysid)

 

转载于:https://my.oschina.net/shawnplaying/blog/753342

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值