将SQL查询转换为flask-sqlalchemy语句

时间:2016-09-23 18:43:17

标签: python sql sqlalchemy flask-sqlalchemy

我正在将我的Web应用程序的旧SQL实现更改为烧瓶炼金术并且在通信方面遇到一些困难。

旧代码看起来像这样。它执行名称查询某些属性并返回csv样式文本。

header = 'id,display_name,city,state,latitude,longitude\n'
base_query = '''SELECT id, bbs_id, city, state, 
                     latitude, longitude FROM mytable'''
conn = sqlite3.connect(path.join(ROOT,'db.sqlite')) 
c = conn.execute(base_query+'WHERE name=?', (name,))
results = c.fetchall()
conn.close()
rows = [','.join(map(str, row)) for row in results]
return header + rows

新代码

header = 'id,display_name,city,state,latitude,longitude\n'
cols = ['id', 'bbs_id', 'city', 'state', 'latitude', 'longitude'] 
users = User.query.filter_by(name=name).all()
rows = ''
for user in users:
    rows += ','.join([user.id, user.bbs_id, user.city, user.state, user.latitude, user.longitude]) + '\n'
return header + rows

我对新代码不满意,因为它很冗长。

  • 有没有办法只选择cols中的那些而不是查询所有列,然后选择所需的列?
  • 如果没有,是否可以更简洁地写出','.join()?似乎user['id']不起作用,我必须user.id

2 个答案:

答案 0 :(得分:1)

如果你只想要一个像以前一样的结果集,你可以这样做:

# escape=`

# Example Dockerfile with escape character changed

FROM windowsservercore
COPY testfile.txt c:\
RUN dir c:\

然后您可以像以前一样使用results = db.session.query(*(getattr(User, col) for col in cols)).filter_by(...)

如果,OTOH,您想使用ORM,可以使用load_only

results

答案 1 :(得分:1)

由于您似乎想要输出逗号分隔值,请使用proper module。您可以使用with_entities覆盖查询的实体:

import csv
import io

...

output = io.StringIO()
writer = csv.writer(output)

headers = ['id', 'bbs_id', 'city', 'state', 'latitude', 'longitude'] 
writer.writerow(headers)

# The other option is to db.session.query(...)
users = User.query.with_entities(
    *(getattr(User, hdr) for hdr in headers)
).filter_by(name=name)
writer.writerows(users)

return output.getvalue()

如果你还在使用python 2,replace io.StringIO with io.BytesIO