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