如何将ResultProxy更改为字符串

时间:2015-08-30 14:02:44

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

当我尝试从数据库返回特定位置的值并将值存储到文本文件时,我收到以下错误:

 Argument must be a string or a number, not 'ResultProxy'.

int(expire)和str(expire)无法转换' ResultProxy'。

 def expire():
      today = datetime.date.today()
      day = today.strftime('%d %b %y')
      conn = engine.connect()
      sql = text('select account.expire from account where account.user_name = "%s"'%('Bob'))
      expire = conn.execute(sql)
      filename = 'mysite/expiry.txt'
      read = open(filename, 'r')

      target = open(filename, 'w')
      target.truncate()
      target.write(str(expire))
      target.write("\n")
      target.close()

      read = open(filename, 'r')
      daysleft = read

 return render_template('expire.html', daysleft=daysleft)

如何将ResultProxy转换为字符串?

2 个答案:

答案 0 :(得分:1)

执行查询总是返回一个行列表,在SQLAlchemy的情况下为ResultProxy。您正在尝试将此结果对象写入文件,而不是实际结果。因为看起来你只期望一个结果,所以只要确保有一个结果要写。

results = conn.execute(sql)

if results:
    expire = results[0]
    # write it to the file

或者,如果您期望多个结果,请循环播放。

results = conn.execute(sql)

for expire in results:
    # write it to the file

答案 1 :(得分:0)

以下是关于如何在Flask-SQLAlchemy中执行此操作的建议。

from flask import Flask
from flask.ext.sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:////tmp/test.db'
db = SQLAlchemy(app)

创建SQLAlchemy使用的模型。我假设你的表有3个字段,一个主键,一个user_name和一个expires字段,我假设这是一个整数,你使用这个字段作为daysleft。

class Account(db.Model):
    __tablename__ = 'account' # Sets the actual name of the table in the db
    user_id = db.Column(db.String, primary_key=True)
    user_name = db.Column(db.String)
    expire = db.Column(db.Integer) 

以下是您将使用该模型的功能。

def expire():
    today = datetime.date.today()
    day = today.strftime('%d %b %y')
    username = 'Bob'

查询帐户模型(通过SQLAlchemy连接到数据库),过滤user_name字段,并仅询问返回的第一条记录(如果有)。

    account = db.session(Account).filter_by(user_name=username).first()
    filename = 'mysite/expiry.txt'
    read = open(filename, 'r')

    target = open(filename, 'w')
    target.truncate()

如果上一个查询没有返回任何行,则帐户将为None。否则,它将是每个返回字段作为属性的字典。您可以使用account.expire访问过期字段的值。

    if account != None:
        target.write(str(account.expire))
    target.write("\n")
    target.close()

    read = open(filename, 'r')
    daysleft = read

    return render_template('expire.html', daysleft=daysleft)