sqlalchemy.exc.InvalidRequestError: Entity ' ' 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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM