一、关系对象映射文件生成
首先创建数据库的关系对象映射,创建之后就可以直接通过对象来操作数据库的表:
1、mysql的连接创建方法
sqlacodegen --noviews --noconstraints --outfile=models.py mysql+mysqlconnector://bds:[email protected]:3306/test
2、sqlserver的连接创建方法sqlacodegen --noviews --noconstraints --outfile=models.py mssql+pymssql://sa:P@[email protected]/sandisk?charset=utf8
以上两个方法对应不同的数据库,分别将以上内容复制到文件中,linux另存为sh,windows另存为bat,直接执行,就会在当前目录下生成一个models.py的文件,具体类容大致如下:
二、创建数据库的连接对象
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from sqlalchemy.orm import scoped_session
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.exc import *
MYSQL_CONNECT_STR = 'mysql+mysqlconnector://bds:[email protected]:3306/test'
# 创建对象的基类:
Base = declarative_base()
# 初始化数据库连接:
db_conn_str = MYSQL_CONNECT_STR
engine = create_engine(db_conn_str, pool_recycle=3600, echo=false)
#可以用此对象对数据库直接进行操作,最好是在http某个基类的__init__函数中赋值,如self.db = db_session,这样每次收到post或get请求都会自动重新创建连接
#然后使用self.db操作,避免多线程使用同一个连接出现问题,即每个任务调用一次db_session
db_session = scoped_session(sessionmaker(bind=engine))
三、使用连接对象进行数据操作
如self.db.query(info_model).filter(info_model.device_code == device_code).first()
四、附带自己写的几个转换方法
1、json转换为可操作的数据库映射对象
def obj_from_dict(class_obj, dict_info):
"""
将json格式的数据转换成class对象
:param class_obj:class对象
:param dict_info:json格式数组
:return:设置好的类对象
"""
try:
for key in dict_info.keys():
if key == 'id': # 去掉自带id字段
continue
setattr(class_obj, key, dict_info[key])
return class_obj
except Exception as e:
logging.error("convert fail from dict=%s, error = %s", dict_info, e)
return None
2、sqlalchemy关系对象转换为json
class AlchemyEncoder(json.JSONEncoder):
"""
SqlAlchemy对象转换为json格式
"""
def default(self, obj):
if isinstance(obj.__class__, DeclarativeMeta):
fields = {}
for field in [x for x in dir(obj) if not x.startswith('_') and x != 'metadata']:
data = obj.__getattribute__(field)
try:
if type(data) is datetime.datetime:
data = data.strftime("%Y-%m-%d %H:%M:%S")
else:
json.dumps(data)
fields[field] = data
except TypeError:
fields[field] = None
return fields
return json.JSONEncoder.default(self, obj)
使用方法:
try:
shop_info = self.db.query(TShopInfo).filter(TShopInfo.shop_id == shop_id).first()
except Exception as err_info:
logging.error("Query shop detail info error:%s" % err_info)
self.db.rollback()
self.write({TAG_STATUS: 1000, TAG_STAT_TXT: "查询失败"})
self.finish()
return
result = json.loads(json.dumps(shop_info, cls=AlchemyEncoder))
此处result即为json了
3、删除字典中多余的字段
当传入的json字段比数据库表中对应的字段多时,通过此方法,删除json中多余的字段,只保留数据库对象中有的字段
def del_from_dict(class_obj, dict_info):
"""
删除字典中不存在指定对象成员变量的key值
:param class_obj: class对象
:param dict_info: json格式数组
:return:返回删除不存在的key后的字典
"""
try:
if isinstance(dict_info, dict) is False:
logging.error("not a dict = %s", dict_info)
return None
keys = list(dict_info.keys())
for key in keys:
if hasattr(class_obj, key) is False:
del dict_info[key]
if len(dict_info) == 0:
logging.error("Get zero length from the dict_info")
return None
return dict_info
except Exception as e:
logging.error("delete the key fail from dict=%s, error=%s", dict_info, e)
return None
mysqlconncter python下载