【问题标题】:Trying to use mysql connector inside a function尝试在函数中使用 mysql 连接器
【发布时间】:2026-01-02 10:00:02
【问题描述】:
from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, BooleanField, SubmitField,IntegerField
from wtforms.validators import DataRequired
from flask import Flask,render_template
import os
import requests
import mysql.connector
import sys
import json
mydb = mysql.connector.connect(
    host="localhost",
    user="tester",
    password="test@123",
    database="flaskapp"
    )
cur=mydb.cursor()
def insert_steamid(s):
    
    api_key=""
    res=requests.get("https://api.brawlhalla.com/search?steamid="+str(s)+"&api_key="+api_key);
    data=json.loads(res.text)
    brawl_id=str(data['brawlhalla_id'])
    res2=requests.get("https://api.brawlhalla.com/player/"+brawl_id+"/ranked?api_key="+api_key)
    data2=json.loads(res2.text)
    rank=data2['global_rank']
    # if(rank==0):
    #     return("no competitive stats available")
    temp=(rank,data2['name'],data2['brawlhalla_id'],data2['region'],data2['legends'][0]['legend_id'])
    sql = "insert into test_table  values (%s,%s,%s,%s,%s)"
    try:
        cur.execute(sql,temp)
        mydb.commit()
        return("data added")
    except mysql.connector.Error as err:
        return(err)



class Config(object):
    SECRET_KEY = os.environ.get('SECRET_KEY') or 'you-will-never-guess'


app = Flask(__name__)
app.config.from_object(Config)



class LoginForm(FlaskForm):
    username = IntegerField('Username', validators=[DataRequired()])
    submit = SubmitField('Sign In')


main_query="select players_1v1.rankp , players_1v1.name , players_1v1.region , legends.legend_name_key  from players_1v1,legends where players_1v1.best_legend = legends.legend_id ;"
cur.execute(main_query)
data=cur.fetchall()
cur.close()
mydb.close()




@app.route('/',methods=['GET','POST'])
def example(): 
    print("ss")
    # cursor.execute("select * from legends") 
    # data = cursor.fetchall() 
    return render_template("index.html", test=data) 

@app.route('/ent',methods=['GET','POST'])
def login():
    steam_id=int(0)
    form = LoginForm()
    msg=str('')
    if form.validate_on_submit():
        msg=insert_steamid(form.username.data)
        print(msg)
        # print('Login requested for user {}, remember_me={}'.format(
        #     form.username.data, "u"))
    else:
        print("no")
    return render_template('form.html', title='Sign In', form=form, message=msg)
if __name__ == '__main__':
    app.run(debug=True) 

这是我的程序,我想做的是从一个函数运行一些 SQL 查询,但这似乎效果不佳。我必须再次在函数中重新定义 mydbcur 才能使其正常工作。我究竟做错了什么? 编辑:在执行main_query 之后,insert_steamid 函数调用光标之前,我关闭了光标。这是我的一个愚蠢的错误

【问题讨论】:

  • 我没有看到 (python) 函数...
  • “似乎效果不佳”并不是对您问题的准确描述。至少你应该添加insert_steamid的代码,肯定还有更多的东西吗?而且,光标实际上做了什么。光标可能也必须在函数内移动,具体取决于您要实现的目标。出于讨论的目的,此代码不完整,因为它没有完全说明“问题”。
  • @Luuk 我已经编辑了函数并添加了整个东西,
  • 你不需要global cur。你需要cur = mydb.cursor()
  • 为什么我在你的代码中看到cur.close() mydb.close()

标签: python mysql flask scope mysql-connector


【解决方案1】:

我认为你需要调试你的代码。

我去掉了一些,并做了一个测试:

import mysql.connector

mydb = mysql.connector.connect(
host="localhost",
user="test",
password="test",
database="test"
)
cur=mydb.cursor()
def insert_steamid(s):
        sql = "SELECT count(*) as i FROM numm"
        print("test")
        try:
            cur.execute(sql)
            for (i) in cur:
                print(s,i)
            mydb.commit()
            return("data added")
        except mysql.connector.Error as err:
            return(err)

mydb = mysql.connector.connect(
host="localhost",
user="test",
password="test",
database="test"
)
cur=mydb.cursor()
print(insert_steamid("abc"))

结果是:

test
abc (10,) 
data added

哪些是正确的,因为我的numm 表中有 10 条记录。

也许我应该投票赞成“因为不可复制而关闭”?

【讨论】:

  • 我更新了问题并添加了我的应用程序的完整代码,我正在烧瓶中开发它,我尝试了你的 sn-p,它似乎工作正常,我不知道为什么我在我的情况下获取光标未连接
  • 好的,我对 python 还很陌生,所以我不会深入到烧瓶中......?