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

posted @ 2019-06-19 11:41  wangju003  阅读(1924)  评论(0编辑  收藏  举报