当我尝试从数据库返回特定位置的值并将值存储到文本文件时,我收到以下错误:
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转换为字符串?
答案 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)