原因:
修改表結構,但沒有更新數據模型造成的
解決辦法:
在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