zoukankan      html  css  js  c++  java
  • sqlalchemy.exc.InvalidRequestError: Entity '<class 'model.TestCase'>' has no property 'project'

    原因:

    修改表结构,但没有更新数据模型造成的

    解决办法:

    在sqlalchemy提供的表模型中增加project字段的描述信息

    这次修改测试框架我有点想不起来,在测试代码中,是怎么通过sqlalchemy对数据库进行增删改查的操作来的呢?

    这里做一个回顾:

    目录结构如图:

    表结构的映射关系在demomodel.py进行定义的

    #导入sqlalchemy相关模块
    from sqlalchemy.ext.declarative import declarative_base
    from sqlalchemy import Column,Integer,Text,String,Enum
    Base =declarative_base()
    
    #测试用例表
    class TestCase(Base):
        __tablename__="testcase"
        id = Column(Integer,primary_key=True)
        api_purpose=Column(String(50))
        request_url=Column(String(100))
        request_method=Column(Enum("POST","GET"))
        request_data_type=Column(Enum("Data","Form","File"))
        request_data=Column(Text,nullable=False)
        assert_method=Column(Enum("assertIn","assertNotIn In"),default="assertIn")
        check_point=Column(String(255))
        correlation=Column(String(100))
        active=Column(Enum("Yes","No"))
        creater = Column(String(50))
        project = Column(Enum("gw", "hw"), default="gw")
    
        def __repr__(self):
            return "<TestCase.%s>"%self.api_purpose

    通过readIni读取 db.ini配置文件中的数据库相关属性。

    通过getConnMysql获取readIni函数返回的连接数据库的信息,连接数据库,并返回一个session对象

    我们可以通过操作这个session对象对数据库,进行增删改查

    配置信息如图:

    代连接数据库的代码如下:

     1 #读取ini配置文件
     2 def readIni(db_path):
     3     config=configparser.RawConfigParser()
     4     config.read(db_path)
     5     confset={}
     6     confset["username"]= config.get("databaseTest","username")
     7     confset["password"]= config.get("databaseTest","password")
     8     confset["url"]= config.get("databaseTest","url")
     9     confset["port"]=config.get("databaseTest","port")
    10     confset["dbname"]= config.get("databaseTest","dbname")
    11     confset["charset"]=config.get("databaseTest","charset")
    12     return  confset
    13 
    14 # 获取数据库连接
    15 def getConnMysql(db_path):
    16     confset = readIni(db_path)
    17     connStr="mysql+mysqlconnector://{username}:{password}@{url}:{port}/{dbname}?charset={charset}".format(
    18         username=confset["username"],
    19         password=confset["password"],
    20         url = confset["url"],
    21         port= confset["port"],
    22         dbname=confset["dbname"],
    23         charset=confset["charset"]
    24     )
    25     engine=create_engine(connStr)
    26     DBsession = sessionmaker(bind=engine)  # 创建DBsession类
    27     session= DBsession()  # 创建session对象
    28 
    29     return session

    今天我犯迷糊主要是搞不清楚这个问题了:

    我们怎么通过sqlalchemy与数据库中的表testcase产生关联,进而对testcase进行增删改查呢?
    答案是:通过model.py中定义的TestCase类与数据库中的表testcase产生关联
    测试我们已经正确连接到数据库的代码是:
     1  from demo.demomodel import TestCase #导入测试环境的模型                
     2                                                                
     3  #指定配置文件的位置                                                    
     4  dirname, filename = os.path.split(os.path.abspath(__file__))  
     5  db_path = os.path.join(dirname, "demodb.ini")                 
     6 
     7  #创建连接数据库对象                     
     8  session=getConnMysql(db_path)  
     9 
    10 #利用session和sqlalchemy提供的 session.query方法对TestCase表进行查询(此处通过model.py中定义的TestCase类与数据库中的表testcase产生关联),查询条件是 project = "hw"的所有记录 
    11 #相当于执行了sql语句:select * from testcase where  project="hw"
    12 
    13 testcase = session.query(TestCase).filter_by(project = "hw").all()   

    运行的结果是:

    其它说明

    session.query(TestCase).all()返回的是一个对象的列表,是list类型,数据库的1条记录就是1个对象

    这里有关于session的讲解:

    当你想打电话给朋友时,你是否得用手机拨通他的号码才能建立起一个会话?同样的,你想和 MySQL 交谈也得先通过 SQLAlchemy 建立一个会话:

    from sqlalchemy.orm import sessionmaker
    
    Session = sessionmaker(bind=engine)
    session = Session()

    你可以把 sessionmaker 想象成一个手机,engine 当做 MySQL 的号码,拨通这个“号码”我们就创建了一个 Session 类,下面就可以通过这个类的实例与 MySQL 愉快的交谈了!

    更多关于sqlalchemy的操作请查看:

    https://www.cnblogs.com/mrchige/p/6389588.html

    https://www.jianshu.com/p/20593da77c04

  • 相关阅读:
    不指定虚拟路径的前提下通过http访问pdf、图片等文件
    Java Service Wrapper将java程序设置为服务
    C# 上传excel文档解析出里面数据
    如何同时启动多个Tomcat服务
    struts2的action的知识点和利用action向页面注入值的操作
    IOS6 字体高亮显示
    微软安全新闻聚焦-双周刊第三十五期
    工厂三兄弟之工厂方法模式(四)
    清空文件夹里面的所有文件和文件夹
    OOP设计模式[JAVA]——03职责链模式
  • 原文地址:https://www.cnblogs.com/kaerxifa/p/11050401.html
Copyright © 2011-2022 走看看