我在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)
答案 0 :(得分:2)
使用filter
,而不是filter_by
。 filter_by
是filter
的快捷方式,它将等式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
。