python通过sqlalchemy操作mysql和sqlserver

一、关系对象映射文件生成

首先创建数据库的关系对象映射,创建之后就可以直接通过对象来操作数据库的表:

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下载

你可能感兴趣的:(python)