原因:

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

解决办法:

在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对象对数据库,进行增删改查

配置信息如图:

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

 #读取ini配置文件
def readIni(db_path):
config=configparser.RawConfigParser()
config.read(db_path)
confset={}
confset["username"]= config.get("databaseTest","username")
confset["password"]= config.get("databaseTest","password")
confset["url"]= config.get("databaseTest","url")
confset["port"]=config.get("databaseTest","port")
confset["dbname"]= config.get("databaseTest","dbname")
confset["charset"]=config.get("databaseTest","charset")
return confset # 获取数据库连接
def getConnMysql(db_path):
confset = readIni(db_path)
connStr="mysql+mysqlconnector://{username}:{password}@{url}:{port}/{dbname}?charset={charset}".format(
username=confset["username"],
password=confset["password"],
url = confset["url"],
port= confset["port"],
dbname=confset["dbname"],
charset=confset["charset"]
)
engine=create_engine(connStr)
DBsession = sessionmaker(bind=engine) # 创建DBsession类
session= DBsession() # 创建session对象 return session

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

我们怎么通过sqlalchemy与数据库中的表testcase产生关联,进而对testcase进行增删改查呢?
答案是:通过model.py中定义的TestCase类与数据库中的表testcase产生关联
测试我们已经正确连接到数据库的代码是:
  from demo.demomodel import TestCase #导入测试环境的模型                

  #指定配置文件的位置
dirname, filename = os.path.split(os.path.abspath(__file__))
db_path = os.path.join(dirname, "demodb.ini") #创建连接数据库对象
session=getConnMysql(db_path) #利用session和sqlalchemy提供的 session.query方法对TestCase表进行查询(此处通过model.py中定义的TestCase类与数据库中的表testcase产生关联),查询条件是 project = "hw"的所有记录
#相当于执行了sql语句:select * from testcase where project="hw" 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

sqlalchemy.exc.InvalidRequestError: Entity '<class 'model.TestCase'>' has no property 'project'的更多相关文章

  1. Superset安装出错 sqlalchemy.exc.InvalidRequestError: Can't determine which FROM clause to join from, ...

    $ superset db upgrade ... Traceback (most recent call last): File "/home/jhadmin/.pyenv/version ...

  2. sqlalchemy.exc.InvalidRequestError: Table 'run_result' is already defined for this MetaData instance

    临时解决办法: 在models文件导入db后,加上如下代码: db.metadata.clear() 但解决问题的根本之处还是在于找到,为何会声明了2次类的定义呢? 解析: table 'roles_ ...

  3. sqlalchemy.exc.StatementError: (sqlalchemy.exc.InvalidRequestError) Can't reconnect until invalid transaction is rolled back

    从这段话获得灵感 重新启动flask shell之后就好了

  4. Entity Framework Model First下改变数据库脚本的生成方式

    在Entity Framework Model First下, 一个非常常见的需求是改变数据库脚本的生成方式.这个应用场景是指,当用户在Designer上单击鼠标右键,然后选择Generate Dat ...

  5. 创建实体数据模型【Create Entity Data Model】(EF基础系列5)

    现在我要来为上面一节末尾给出的数据库(SchoolDB)创建实体数据模型: SchoolDB数据库的脚本我已经写好了,如下: USE master GO IF EXISTS(SELECT * FROM ...

  6. Entity Framework的核心 – EDM(Entity Data Model) 一

    http://blog.csdn.net/wangyongxia921/article/details/42061695 一.EnityFramework EnityFramework的全程是ADO. ...

  7. EF,ADO.NET Entity Data Model简要的笔记

    1. 新建一个项目,添加一个ADO.NET Entity Data Model的文件,此文件会生成所有的数据对象模型,如果是用vs2012生的话,在.Designer.cs里会出现“// Defaul ...

  8. Create Entity Data Model

    http://www.entityframeworktutorial.net/EntityFramework5/create-dbcontext-in-entity-framework5.aspx 官 ...

  9. sqlalchemy.exc.ProgrammingError: (pymysql.err.ProgrammingError)

    在我学习flask建立网站时间碰到了一个棘手的问题,就是在我进行操作日志的更新时间,发现表格建立有点错误,导致表缺失,从而报了下面的错误 sqlalchemy.exc.ProgrammingError ...

随机推荐

  1. Wget下载多个链接

    需要wget下载多个文件链接时,可以采用如下方法: 1. 将链接存入文件url.list中: 2. wget -bc -i url.list -o [log_file] -P [target_dir] ...

  2. 获取Linux磁盘分区的UUID

    在设置fstab自动挂载时,需要填写如下的信息: # <file system> <mount point> <type> <options> < ...

  3. 跟踪oracle中sql语句运行过程及相关知识拓展

    select * from v$sqlarea; select * from v$sqlarea where first_load_time>'2010-11-27/09:30:00'; 这种方 ...

  4. [DevExpress]DevExpress的安装与使用

    一.下载安装文件 依据自己的须要选择不同的版本号.下面为15.1 安装时选择自己须要的模块进行安装,之后进行激活,购买授权或者"其它方式". 二.安装完 在VSIDE工具栏会添加下 ...

  5. JTabbedPane的LookAndFeel--TabbedPaneUI

    在定制JTabbedPane的时候是需要使用到LookAndFeel的,而使用LookAndFeel定制的时候,其实主要是继承BasicTabbedPaneUI. to be continue...

  6. 安装Node.js 以及命令行使用

    安装 官方的安装包 安装完成之后,会自动添加到环境变量中 通过visual studio安装 命令行 查看版本 PS C:\Users\clu\Desktop> node --version v ...

  7. YTU 2623: B 抽象类-形状

    2623: B 抽象类-形状 时间限制: 1 Sec  内存限制: 128 MB 提交: 235  解决: 143 题目描述 定义一个抽象类Shape, 类中有两个纯虚函数. 具体类正方形类Shape ...

  8. go 安装方法

    wget https://storage.googleapis.com/golang/go1.5.linux-amd64.tar.gz sudo tar -C /usr/local -xzf go1. ...

  9. [2017SEERC]Divide and Conquer

    https://www.zybuluo.com/ysner/note/1308834 题面 一个有\(n\)个点的图,上面有有两棵不同的生成树.问至少切断几条边,可以使原图不联通.并输出方案数. \( ...

  10. bzoj4195 [Noi2015]程序自动分析——并查集

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4195 突然在这道大水题上WA了半天... 思路很简单,离线处理询问,先把 = 的都加到并查集 ...