python - SQLAlchemy:查询数据库时遇到困难

标签 python sqlalchemy

我正在编写一个小型 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 对象,以查找其名字与传入的 playerObjectfirstName 以及其姓氏相匹配的条目名称与传入的 playerObjectlastName 相匹配。

知道为什么我会收到此错误吗?

我最初在 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/

相关文章:

python - 导入错误 : cannot import name BytesIO on eclipse

python - 根据另一个 Pandas 数据框中的重叠范围以及同一范围的总和值映射 2 列的范围

python - SQLAlchemy 线程池执行器 "Too many clients"

python - 在 Python 中过滤 SQL 语句以防止恶意注入(inject)

sqlalchemy - 在 Alembic 迁移中访问模型

python - Python 中捕获组的字符串操作

python - 连接 "database"不存在 Django、CentOS7、NGINX、UWSGI

python - 如何从文件中打印单行

python - Flask sqlalchemy 过滤每个对象的关系中的对象

python - SqlAlchemy : I want to filter query on 2 foreign keys