在 Django 应用程序中批量 SQL INSERT

Batch SQL INSERT in Django App

我正在按照 this example 将记录批量插入到 table 但修改它以适合我的具体示例

sql='INSERT INTO CypressApp_grammatrix (name, row_num, col_num, gram_amount) VALUES {}'.format(', '.join(['(%s, %s, %s, %s)']*len(gram_matrix)),)
    #print sql

    params=[]
    for gram in gram_matrix:
        col_num=1
        for g in gram:            
            params.extend([(matrix_name, row_num, col_num, g)])
            col_num += 1
        row_num += 1
    print params

    with closing(connection.cursor()) as cursor:
        cursor.execute(sql, params)

但是,在这样做时,我收到了这个错误

return cursor._last_executed.decode('utf-8')
File "/usr/local/lib/python2.7/dist-packages/django/db/backends/mysql/base.py", line 150, in __getattr__
return getattr(self.cursor, attr)
AttributeError: 'Cursor' object has no attribute '_last_executed'

我想知道为什么我收到这个错误以及我可以做些什么来修复它,虽然我觉得问题可能出在这段与 MySQL 一起工作的代码上,但我没有写 [=15] =]

def last_executed_query(self, cursor, sql, params):
    # With MySQLdb, cursor objects have an (undocumented) "_last_executed"
    # attribute where the exact query sent to the database is saved.
    # See MySQLdb/cursors.py in the source distribution.
    return cursor._last_executed.decode('utf-8')

所以我不知道我是否只有一个旧的 MySQLdb 副本或什么,但问题似乎出在 cursors.py。该文件中唯一可以找到 _last_executed 的地方是这里

def _do_query(self, q):
    db = self._get_db()
    self._last_executed = q
    db.query(q)
    self._do_get_result()
    return self.rowcount

但是,__init__并没有将这个变量设置为实例属性。它完全不见了。所以我冒昧地自己添加它并将其初始化为一些查询字符串。我假设任何人都可以,所以我只是添加了

class BaseCursor(object):

"""A base for Cursor classes. Useful attributes:

description
    A tuple of DB API 7-tuples describing the columns in
    the last executed query; see PEP-249 for details.

description_flags
    Tuple of column flags for last query, one entry per column
    in the result set. Values correspond to those in
    MySQLdb.constants.FLAG. See MySQL documentation (C API)
    for more information. Non-standard extension.

arraysize
    default number of rows fetchmany() will fetch

"""

from _mysql_exceptions import MySQLError, Warning, Error, InterfaceError, \
     DatabaseError, DataError, OperationalError, IntegrityError, \
     InternalError, ProgrammingError, NotSupportedError

def __init__(self, connection):
    from weakref import ref    
    ...
    self._last_executed ="SELECT * FROM T"

    ...

现在光标对象确实具有属性 _last_executed 并且当此函数

def last_executed_query(self, cursor, sql, params):
    # With MySQLdb, cursor objects have an (undocumented) "_last_executed"
    # attribute where the exact query sent to the database is saved.
    # See MySQLdb/cursors.py in the source distribution.
    return cursor._last_executed.decode('utf-8')

in base.py 被调用,属性确实存在所以这个错误

return cursor._last_executed.decode('utf-8')
File "/usr/local/lib/python2.7/dist-
packages/django/db/backends/mysql/base.py", line 150, in __getattr__
return getattr(self.cursor, attr)
AttributeError: 'Cursor' object has no attribute '_last_executed'     

不会遇到。至少我认为它是这样工作的。无论如何,它解决了我的问题。