在 SQLAlchemy 中使用 fliter_by 函数传递参数时出错

Getting errors with passing parameters with fliter_by function in SQLAlchemy

对于 SQLalchemy

中的 table,我有以下 class
class STDcodes(db.Model):
id = db.Column(db.Integer, primary_key=True)
stdcode = db.Column(db.Integer, nullable=False)
city = db.Column(db.String(30), nullable=False)
state = db.Column(db.String(30), nullable=False)


def __init__(self, stdcode, city, state):
    self.stdcode = stdcode
    self.city = city
    self.state = state

def __repr__(self):
    return '<City {}>'.format(self.city)

现在我有一个包含一些城市名称的文本文件。我想在上面的数据库中找到城市并用其他东西替换它们的州值("Telangana") 我正在尝试使用以下代码来执行此操作。

from flask_hello_world_app import db, STDcodes
f = open('telanganastd.txt')
lines = f.readlines()
for line in lines:
    line=line.replace("\n","")
    print line
    stdcode = STDcodes.query.filter_by(STDcodes.city.startswith(line))
    stdcode.state= "TELANGANA"
    db.session.add(stdcode)
    db.session.commit()

但是没用。 我收到以下错误:

Traceback (most recent call last):
File "/home/alan/Desktop/Python books/Numbersindia/replacetelangana.py", line 10, in <module>
stdcode = STDcodes.query.filter_by(STDcodes.city.startswith(line)).first()
TypeError: filter_by() takes exactly 1 argument (2 given)

使用 filter,而不是 filter_byfilter_byfilter 的快捷方式,它将相等操作应用于关键字参数,您不能将它用于其他操作。

filter 接受诸如 User.name == 'davidism'STDcodes.city.startswith(line) 之类的操作,并将它们应用于查询。 filter_by 是一种快捷方式,它采用关键字参数而不是操作,并将它们扩展为等效的相等操作。所以 filter_by(name='davidism', superuser=True) 等价于 filter(User.name == 'davidism', User.superuser).

所以 filter_by 可能很方便但有局限性:假定所有关键字都是要过滤的主要模型上的列,唯一支持的操作是相等,所有操作都是 and'在一起,没有办法使用 or.