在 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_by
。 filter_by
是 filter
的快捷方式,它将相等操作应用于关键字参数,您不能将它用于其他操作。
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
.
对于 SQLalchemy
中的 table,我有以下 classclass 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_by
。 filter_by
是 filter
的快捷方式,它将相等操作应用于关键字参数,您不能将它用于其他操作。
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
.