Flask 和 SQLAlchemy - 错误绑定参数
Flask and SQLAlchemy - error binding parameter
总的来说,我对编程还很陌生,我正在尝试构建一个简单的网站作为我的宠物项目。
它是使用 python 构建的,使用 Flask 和 SQLAlchemy 作为数据库。
我试图通过使用 BufferIO 将其转换为字节流然后将其编码为 base64 UTF-8 作为字节字符串(这是我可能做错的地方)然后将其存储在数据库的字符串列中。
将字符串打印到控制台,我看不出有什么问题,但我遇到了数据库错误,看来我碰壁了。
如果有人能指出我正确的方向,或者如果我尝试完全不同的方法,我将不胜感激,因为我尝试了几种不同的方法,但似乎没有任何效果。谢谢!
我遇到的错误:
(sqlite3.InterfaceError) Error binding parameter 2 - probably unsupported type.
[SQL: INSERT INTO qrdb (data, qr_b64s, date, owner_id) VALUES (?, ?, CURRENT_TIMESTAMP, ?)]
[parameters: ('test', 'iVBORw0KGgoAAAANSUhEUgAAASIAAAEiAQAAAAB1xeIbAAABjklEQVR4nO2aQW6kMBRE3x9bytJIOUCOYm4wZ50bNEeZA0Syl0hu1SzAnSa9mGxoaLAXH7Ce5BL6KsoWJv4_hl8_gKBRjWpUoxq1d ... (310 characters truncated) ... q50xhxy2KypyCmuesSuX5rN6sq_n-drd_9a9J-W_PInem4WM0wZWWc55I3eV78pus34muI1IP55jkbs73hNFa369IPZxjQs33SrR8vyZl7d-oRjWqUY06BfUPhs3JLUffqKQAAAAASUVORK5CYII=', <User 1>)]
生成器函数:
def enq(data):
qr = qrcode.make(data)
img_buffer = BytesIO()
qr.save(img_buffer, format='PNG')
byte_data = img_buffer.getvalue()
b64s = base64.urlsafe_b64encode(byte_data)
string = str(b64s, 'UTF-8')
return string
发布到数据库:
if request.method == 'POST':
data = request.form.get('data')
if len(data) < 1:
flash('Data too short!', category='error')
else:
new_qr = Qrdb(qr_b64s=codegen.enq(data), data=data, owner_id=current_user)
db.session.add(new_qr)
db.session.commit
print('Qr added to DB.')
数据库模型:
class Qrdb(db.Model):
id = db.Column(db.Integer, primary_key=True)
data = db.Column(db.String(10000))
qr_b64s = db.Column(db.String(10000))
date = db.Column(db.DateTime(timezone=True), default=func.now())
owner_id = db.Column(db.Integer, db.ForeignKey('user.id'))
行
new_qr = Qrdb(qr_b64s=codegen.enq(data), data=data, owner_id=current_user)
应该是
new_qr = Qrdb(qr_b64s=codegen.enq(data), data=data, owner_id=current_user.id)
因为 Qrdb.owner_id
是一个 整数 列。如果您更改 Qrdb
模型以将 relationship 添加到 User
模型,那么您可以传递 User
实例而不是整数。
总的来说,我对编程还很陌生,我正在尝试构建一个简单的网站作为我的宠物项目。
它是使用 python 构建的,使用 Flask 和 SQLAlchemy 作为数据库。
我试图通过使用 BufferIO 将其转换为字节流然后将其编码为 base64 UTF-8 作为字节字符串(这是我可能做错的地方)然后将其存储在数据库的字符串列中。
将字符串打印到控制台,我看不出有什么问题,但我遇到了数据库错误,看来我碰壁了。
如果有人能指出我正确的方向,或者如果我尝试完全不同的方法,我将不胜感激,因为我尝试了几种不同的方法,但似乎没有任何效果。谢谢!
我遇到的错误:
(sqlite3.InterfaceError) Error binding parameter 2 - probably unsupported type.
[SQL: INSERT INTO qrdb (data, qr_b64s, date, owner_id) VALUES (?, ?, CURRENT_TIMESTAMP, ?)]
[parameters: ('test', 'iVBORw0KGgoAAAANSUhEUgAAASIAAAEiAQAAAAB1xeIbAAABjklEQVR4nO2aQW6kMBRE3x9bytJIOUCOYm4wZ50bNEeZA0Syl0hu1SzAnSa9mGxoaLAXH7Ce5BL6KsoWJv4_hl8_gKBRjWpUoxq1d ... (310 characters truncated) ... q50xhxy2KypyCmuesSuX5rN6sq_n-drd_9a9J-W_PInem4WM0wZWWc55I3eV78pus34muI1IP55jkbs73hNFa369IPZxjQs33SrR8vyZl7d-oRjWqUY06BfUPhs3JLUffqKQAAAAASUVORK5CYII=', <User 1>)]
生成器函数:
def enq(data):
qr = qrcode.make(data)
img_buffer = BytesIO()
qr.save(img_buffer, format='PNG')
byte_data = img_buffer.getvalue()
b64s = base64.urlsafe_b64encode(byte_data)
string = str(b64s, 'UTF-8')
return string
发布到数据库:
if request.method == 'POST':
data = request.form.get('data')
if len(data) < 1:
flash('Data too short!', category='error')
else:
new_qr = Qrdb(qr_b64s=codegen.enq(data), data=data, owner_id=current_user)
db.session.add(new_qr)
db.session.commit
print('Qr added to DB.')
数据库模型:
class Qrdb(db.Model):
id = db.Column(db.Integer, primary_key=True)
data = db.Column(db.String(10000))
qr_b64s = db.Column(db.String(10000))
date = db.Column(db.DateTime(timezone=True), default=func.now())
owner_id = db.Column(db.Integer, db.ForeignKey('user.id'))
行
new_qr = Qrdb(qr_b64s=codegen.enq(data), data=data, owner_id=current_user)
应该是
new_qr = Qrdb(qr_b64s=codegen.enq(data), data=data, owner_id=current_user.id)
因为 Qrdb.owner_id
是一个 整数 列。如果您更改 Qrdb
模型以将 relationship 添加到 User
模型,那么您可以传递 User
实例而不是整数。