Python和MySQLdb的警告(Python and MySQLdb warnings)

2019-10-28 20:31发布

我有一个出口MSSQL数据并将其导入MySQL的一个程序。 我有一个输入如下功能:

def importMySql (mycursor,exportedfilename,table,delimiter):
    file_loc = str(sys.path[0] +"\\" +exportedfilename.lower()+".out").replace("\\", "\\\\")
    mycursor.execute("LOAD DATA LOCAL INFILE '%s' INTO TABLE %s FIELDS TERMINATED BY '%s' LINES TERMINATED BY '\r\n'" %(str(file_loc), table, delimiter))

光标(MySQLdb的)是提高以下警告:

C:\Users\tfy\Documents\PyProj\UTL (Export, Import, RDF)\eic.py:98: Warning: Data truncated for column 'DateofCharges' at row 1194
  mycursor.execute("LOAD DATA LOCAL INFILE '%s' INTO TABLE %s FIELDS TERMINATED BY '%s' LINES TERMINATED BY '\r\n'" %(str(file_loc), table, delimiter))
C:\Users\tfy\Documents\PyProj\UTL (Export, Import, RDF)\eic.py:98: Warning: Data truncated for column 'DateofCharges' at row 2009
  mycursor.execute("LOAD DATA LOCAL INFILE '%s' INTO TABLE %s FIELDS TERMINATED BY '%s' LINES TERMINATED BY '\r\n'" %(str(file_loc), table, delimiter))
C:\Users\tfy\Documents\PyProj\UTL (Export, Import, RDF)\eic.py:98: Warning: Data truncated for column 'DateofCharges' at row 4793
  mycursor.execute("LOAD DATA LOCAL INFILE '%s' INTO TABLE %s FIELDS TERMINATED BY '%s' LINES TERMINATED BY '\r\n'" %(str(file_loc), table, delimiter))

但我需要控制的警告只能输出:

Warning: Data truncated for column 'DateofCharges' at row 1194
Warning: Data truncated for column 'DateofCharges' at row 2009
Warning: Data truncated for column 'DateofCharges' at row 4739

我环顾四周,发现大量的信息,说明怎么样了创建自定义警告。 然而,不知道我会怎样实现以上。 我不想关掉警告,我只是想“格式化”他们。 我认为有关编辑实际MySQLdb的文件,但它是在.egg格式,无法做到这一点。 我也玩过周围warning.format()但没有成功。

谢谢!

Answer 1:

所以这是我发现的最简单的方法...不知道为什么我没有想到这本来......但我只是抑制光标发出的警告:

import warnings
warnings.filterwarnings("ignore", category = MySQLdb.Warning)

然后,我将此代码添加到我的importMySql功能:

mycursor.execute("SHOW WARNINGS")
warnings = mycursor.fetchall()
for i in range(len(warnings)):
    print "Warning - " +warnings[i][2]


Answer 2:

想出解决办法使用pprint。 由于有机磷农药溶液中的默认警告需要被抑制,然后添加show_warnings功能,然后使用新的打印格式。

from warnings import filterwarnings
import MySQLdb as mdb
from pprint import pprint

filterwarnings('ignore', category = mdb.Warning)
con = mdb.connect(...)
cur = con.cursor()
query = "Update table ..."
cur.execute(query)
con.commit()
warnings = con.show_warnings() # return in tuple type
pprint(warnings, width=100, depth=2) # width is the num of characters in each line, and depth is the level of the warnings in the tuple


Answer 3:

使用MySQLdb的

你可以猴子补丁MySQLdb的实现这一点:

import types

def warning_check(self):
    if not self._warnings:
        self.messages = ()
        return
    self.messages = self._get_db().show_warnings()

然后修补Cursor对象在你的函数是这样的:

cur._warning_check = types.MethodType(warning_check, cur)

然后,当你完成执行LOAD DATA.. ,可以打印信息:

cur.execute("LOAD DATA..")
for msg in cur.messages:
    print "Warning: {msg}".format(msg=msg[2])

使用MySQL连接器/ Python的

使用MySQL连接器/ Python中,你会做这样的事情:

cnx.get_warnings = True
cur.execute("LOAD DATA..")
for msg in cur.fetchwarnings():
    print "Warning: {msg}".format(msg=msg[2])

(请注意,您需要使用连接参数设置客户端标志client_flags=[mysql.connector.ClientFlag.LOCAL_FILES]



Answer 4:

它可以在一个子进程运行MySQL的代码? 如果是这样,你可以使用Python的子进程来运行MySQL的代码,从标准输出读取输出,并相应地格式化。 例如,使用process.stdout.readline()

你可以参考这样一个问题: 启动和通过标准输入/输出与Python控制外部进程



文章来源: Python and MySQLdb warnings