使用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)