beishanfengyun 2017-11-08 11:46 采纳率: 42.9%
浏览 5734
已采纳

Python 使用多线程写入数据库,报错

#问题描述,定义了一个函数,用于数据库写入表,直接使用函数是可以运行,但我创建了一个
多线程,在多线程里面使用运行函数,然后后错
import mysql.connector
from mysql.connector import errorcode
import threading,time

#数据库连接参数

def sqlconn():
dbconfig={'user': 'qrcodeadmin','password': 'careyes!@#','host': '119.23.8.62','port':3308,'database': 'qrcodes','raise_on_warnings': True}
try:
cnx = mysql.connector.connect(**dbconfig)
print('数据库连接成功')
except mysql.connector.Error as err:
if err.errno == errorcode.ER_ACCESS_DENIED_ERROR:
print("Something is wrong with your user name or password")
elif err.errno == errorcode.ER_BAD_DB_ERROR:
print("Database does not exist")
else:
print(err.encode)
return cnx

def handle():
while(True):
global UID,ID
for i in range(50):
print(i)
sqlinsert="INSERT INTO qrcode (URL,QrID) VALUES (%s,%s)",(UID,ID)
cur.execute(sqlinsert[0],sqlinsert[1])
cur.execute(sqlinsert[0],sqlinsert[1])
dbcon.commit()

if name=='__main__':
global cur
dbcon=sqlconn()
cur=dbcon.cursor()
UID=' MjAxNzEwMTExMjQyNDQ'
ID='201710111242420111'
#直接使用handle可以运行
handle()
#-------------
sql_thread=threading.Thread(target=handle)
#如果使用线程就会报错
sql_thread.start()
dbcon.close()
print(dbcon)

    #报错内容
    Exception in thread Thread-1:

Traceback (most recent call last):
File "C:\Python\lib\site-packages\mysql\connector\connection.py", line 280, in
_send_cmd
self._socket.send(
AttributeError: 'NoneType' object has no attribute 'send'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "C:\Python\lib\threading.py", line 914, in _bootstrap_inner
self.run()
File "C:\Python\lib\threading.py", line 862, in run
self._target(*self._args, **self._kwargs)
File "sqltestV0.2_Thread.py", line 34, in handle
cur.execute(sqlinsert[0],sqlinsert[1])
File "C:\Python\lib\site-packages\mysql\connector\cursor.py", line 561, in exe
cute
self._handle_result(self._connection.cmd_query(stmt))
File "C:\Python\lib\site-packages\mysql\connector\connection.py", line 514, in
cmd_query
result = self._handle_result(self._send_cmd(ServerCmd.QUERY, query))
File "C:\Python\lib\site-packages\mysql\connector\connection.py", line 284, in
_send_cmd
raise errors.OperationalError("MySQL Connection not available.")
mysql.connector.errors.OperationalError: MySQL Connection not available.

  • 写回答

5条回答 默认 最新

  • CaiNiaoWuZui 2017-11-08 19:37
    关注

    楼上的原因在于,commit是独占式的,因此在某个线程commit的时候,其它线程执行execute,就会出现楼主的错误。因为对这个线程来说,conn是 not available的,因此
    1:建议先生成一个.sql文件,再导入。
    2:多线程使用同一个链接时,在所有的execute完成之后再统一commi;
    3:多线程使用同一个链接时,如果不想使用第二个方式,请使用lock避免踩空
    在import下面加上
    mutex = threading.Lock()

    if mutex.acquire():

    cur.execute(sqlinsert[0],sqlinsert[1])
    dbcon.commit()
    mutex.release()

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
  • beishanfengyun 2017-11-08 11:47
    关注

    代码复制过来的时候,空格被网页去掉了。语法里面应该有空格缩进。

    评论
  • oyljerry 2017-11-08 12:50
    关注

    MySQL连接有问题,没有连接成功

    评论
  • JPF1024 2017-11-08 14:35
    关注

    MySQL Connection not available.

    连接有问题,你先用工具试试能不能连接到MySQL.

    评论
  • crazyskady 2017-11-08 15:03
    关注

    将dbcon作为参数传到线程里或者定义成global的来使用。

    评论
查看更多回答(4条)

报告相同问题?

悬赏问题

  • ¥15 易语言编写cs.16 绘制 矩阵出现了点问题 不知道这个矩阵可不可以使用
  • ¥15 k210显示failed init to model
  • ¥15 Evil-droid生成的APK手机已经下载但无法建立任务
  • ¥25 c语言韩信点兵的变式
  • ¥15 怎么根据书上的例子完成这个问题呢?
  • ¥15 ECharts 增加Zoom,整行包括右边的Text一起滑动
  • ¥15 关于网上一个easyx制作的见缝插针小游戏(c++)
  • ¥15 开地址法双散列函数处理碰撞
  • ¥15 想问一下这个是什么情况 虚拟机Linux打不开了
  • ¥15 联通光猫掉注册了怎么重新注册上去