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

时间:2015-01-18 02:15:27

标签: python python-2.7 flask sqlalchemy flask-sqlalchemy

我在SQLalchemy

中有一个表的以下类
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)

现在我有一个带有一些城市名字的文本文件。我想在上面的数据库中找到城市并用其他东西替换他们的状态值(&#34; Telangana&#34;) 我尝试使用以下代码来执行此操作。

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)

1 个答案:

答案 0 :(得分:2)

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

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'd在一起,没有办法使用or