【发布时间】:2020-12-10 13:49:16
【问题描述】:
我在 sqlalchemy 中解码/编码二进制列有问题。我在 MSSQL 中有数据库,其中表中的主键是二进制。
class Kated(db.Model):
__tablename__ = 'T$KATED'
nrec = db.Column('F$nrec', db.Binary(8), primary_key=True)
abbr = db.Column('F$abbr', db.String(100), nullable=False)
name = db.Column('F$name', db.String(300), nullable=False)
def __repr__(self):
return '<T$KATED %r>' % self.nrec`
我在网页上打印值:
kated = Kated.query.all()
items = []
for el in kated:
items.append({
'nrec': el.nrec,
'abbr': el.abbr,
'name': el.name
})
return render_template("posts.html", kated=items)
在html中
{% for el in kated %}
<div class ="alert alert-info">
<h2>{{ el.abbr }}</h2>
<p>{{ el.name }}</p>
<p>{{ el.nrec }}</p>
<a href="/post_detail?arg1={{el.nrec}}" class="btn btn-warning">Detail</a>
</div>
{% endfor %}
当我打印二进制值时,它看起来像 b'\x80\x00\x00\x00\x00\x00\x00\x02'
当我单击“详细信息”按钮时,它会生成请求
http://127.0.0.1:5000/post_detail?arg1=b%27\x80\x00\x00\x00\x00\x00\x00\x02%27
但是当我想找到我按键记录时,值需要编码(否则是类型错误)
@app.route('/post_detail', methods=['GET'])
def post_detail():
arg1=request.args.get('arg1')
nrec1=arg1.encode('utf-8')
print(arg1)
print(nrec1)
print(type(nrec1))
print(nrec1.decode())
kated = Kated.query.get(nrec1)
return render_template("post_detail.html", kated=kated)
结果:
b'\x80\x00\x00\x00\x00\x00\x00\x02'
b"b'\\x80\\x00\\x00\\x00\\x00\\x00\\x00\\x02'"
<class 'bytes'>
b'\x80\x00\x00\x00\x00\x00\x00\x02'
不带encode('utf-8')返回错误,带encode('utf-8')的值被修改。
怎么了?
【问题讨论】:
-
看起来
arg1是字节对象的字符串化repr(str(b'\xnn\xnn')的结果。你可以通过调用ast.literal_eval(arg1)来解决这个问题,但如果客户端会更好正确编码数据(urlencoding 或 base64)。 -
你能说得更详细些吗?我是 Python 的大三学生。谢谢。
-
我尝试使用 urllib。 Arg1 看起来像二进制,但它是一个 str,我不知道如何处理它。
-
你能不能edit这个问题来显示传入请求是如何创建的?
-
我按照你说的编辑了问题。感谢您的帮助!
标签: python sql-server sqlalchemy flask-sqlalchemy encode