【问题标题】:translate SQL query to flask-sqlalchemy statements将 SQL 查询转换为 flask-sqlalchemy 语句
【发布时间】:2017-02-01 17:11:31
【问题描述】:

我正在将 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

【问题讨论】:

    标签: python sql sqlalchemy flask-sqlalchemy


    【解决方案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

    【讨论】:

      【解决方案2】:

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

      results = db.session.query(*(getattr(User, col) for col in cols)).filter_by(...)
      

      然后你可以像以前一样使用results

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

      users = User.query.options(*(load_only(col) for col in cols)).filter_by(...)
      rows = "".join(",".join(*(getattr(u, col) for col in cols)) + "\n" for u in users)
      

      【讨论】:

      • filter_by(name=name) 怎么样?
      • @nos 将其添加到示例中。
      猜你喜欢
      • 2022-09-27
      • 2013-07-09
      • 2017-04-25
      • 2019-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-31
      相关资源
      最近更新 更多