[英]Cannot insert integer to MySQL in python
在我的 flask 应用程序中,我无法插入从request.form
获得的user_id
,它是 integer 到 MySQL。 这是我的代码:
from flask import Flask, jsonify, render_template
from flask import request
import socket
from flask_mysqldb import MySQL
app = Flask(__name__)
app.config['MYSQL_HOST'] = '192.168.0.101'
app.config['MYSQL_USER'] = 'root'
app.config['MYSQL_PORT'] = '3307'
app.config['MYSQL_PASSWORD'] = 'password'
app.config['MYSQL_DB'] = 'msblog_users'
mysql = MySQL(app)
@app.route("/create_post", methods = ['POST', 'GET'])
def create_post():
if request.method == 'GET':
return "You can only send post requests here!"
if request.method == 'POST':
user_id = request.form.get('user_id')
message = request.form.get('message')
cursor = mysql.connection.cursor()
cursor.execute('''INSERT INTO posts (user_id, post)VALUES (%s, %s)''', (int(user_id), message))
mysql.connection.commit()
cursor.close()
return "Done"
我收到以下错误:
TypeError: 'str' object cannot be interpreted as an integer
我应该怎么办? 我做了很多搜索,但到目前为止一无所获!
错误来自int(user_id)
部分,特别是由于值为None
。 您应该首先确保它是有效的 integer:
try:
user_id = int(request.form.get('user_id'))
except (ValueError, TypeError):
return <error 400>
最后,我发现了问题。 太奇怪了,这个问题甚至与插入查询无关:看一下我的flask代码中的MySQL连接配置部分,如下所示:
app.config['MYSQL_HOST'] = '192.168.0.101'
app.config['MYSQL_USER'] = 'root'
app.config['MYSQL_PORT'] = '3307'
app.config['MYSQL_PASSWORD'] = 'password'
app.config['MYSQL_DB'] = 'msblog_users'
端口写在引号之间! 这是一个字符串,但 MySQL 需要一个 integer 值才能使端口能够连接!
这是快速修复:
app.config['MYSQL_PORT'] = 3307
我花了一天时间解决它!
%s
代表字符串,如果您希望该参数为 integer,请将其设为%i
。
INSERT INTO posts (user_id, post)VALUES (%i, %s) ....
如果post
是一个字符串/文本列(可能是varchar),你也应该这样引用它。
cursor.execute("INSERT INTO posts (user_id, post) VALUES (%i , '%s')" % (1, 'string value')
顺便说一句,这是格式化字符串的旧方法
新方法是这样做的:
cursor.execute("INSERT INTO posts (user_id, post) VALUES ({}, '{}')".format(1, 'string value')
或者您可以命名参数:
"INSERT INTO posts (user_id, post) VALUES ({id}, '{str}')".format( str='string value',id=1)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.