我正在编写一个小型 Python 脚本/应用程序,并且刚刚接触 SQLAlchemy。我唯一的类是“Player”,其定义如下:
class Player:
def __init__(self, rating, college, ranking = None, firstName = None, lastName = None):
self.rating = rating
self.college = college
self.ranking = ranking
self.firstName = firstName
self.lastName = lastName
现在我有一个名为databaseFunctions.py的模块,其中有这两个函数:
#if player exists, update his rating and ranking; otherwise, add new object to DB
def updateSpecificDBEntry(playerObject, session):
#find player in DB with firstName and lastName
currentPlayer = session.query(Player).filter(firstName == playerObject.firstName).filter(playerObject.lastName == lastName).first()
#set rating = newRating
if currentPlayer.count():
currentPlayer.rating = playerObject.rating
currentPlayer.ranking = playerObject.ranking
else:
addEntryToDB(playerObject, session)
def updateEntireDB(arrayOfPlayerObjects, session):
for player in arrayOfPlayerObjects:
updateSpecificDBEntry(player, session)
这是我的主要方法:
def main():
#create engine (for use by base and session)
engine = databaseFunctions.createEngine()
#create session
session = databaseFunctions.createSession(engine)
#get all players from CSA website
allPlayers = getSortedGender(constants.mainURL, constants.menTeams)
databaseFunctions.updateEntireDB(allPlayers, session)
我的代码实际上一直有效到最后一次函数调用。此时,我收到以下错误:
File "helpfulFunctions.py", line 114, in <module>
main()
File "helpfulFunctions.py", line 107, in main
databaseFunctions.updateEntireDB(allPlayers, session)
File "/Users/benjaminclayman/Desktop/SquashScraper/databaseFunctions.py", line 42, in updateEntireDB
updateSpecificDBEntry(player, session)
File "/Users/benjaminclayman/Desktop/SquashScraper/databaseFunctions.py", line 32, in updateSpecificDBEntry
currentPlayer = session.query(Player).filter(firstName == playerObject.firstName).filter(playerObject.lastName == lastName).first()
NameError: global name 'firstName' is not defined
我有点困惑,因为我正在查询数据库中的所有 Player 对象,以查找其名字与传入的 playerObject
的 firstName
以及其姓氏相匹配的条目名称与传入的 playerObject
的 lastName
相匹配。
知道为什么我会收到此错误吗?
我最初在 main() 中调用了这个函数,但没有使用它,所以将其取出:
def createBase(engine):
Base = declarative_base()
Base.metadata.create_all(engine)
return Base
正如我所说:
Base = databaseFunctions.createBase(engine)
然后对Base
什么都不做。不确定这是否是问题的一部分。
感谢您的帮助, BClayman
最佳答案
在 updateSpecificDBEntry 过滤器中,您有:
.filter(firstName == playerObject.firstName)
变量“firstName”不存在。
看起来你的意思是这样的:
currentPlayer = session.query(Player).filter(Player.firstName == playerObject.firstName).filter(playerObject.lastName == Player.lastName).first()
因此,您要根据给定的playerObject 属性过滤Player 列。
关于python - SQLAlchemy:查询数据库时遇到困难,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30879938/