Сохранение двоичных данных в MySQLdb - Python - PullRequest
1 голос
/ 25 февраля 2011

Я гуглил и искал этот сайт, но ничего конкретного не появляется и не могу заставить это работать. Вот код:

    binData = ''.join(map(lambda x: chr(x % 256), attach.attcoll))

    sql_stmt = """INSERT INTO attachments (attno,filename,fileextension,projNo,procNo,wpattachment) \
    VALUES ('%s','%s','%s','%s','%s','%s') ON DUPLICATE KEY UPDATE filename='%s',fileextension='%s'""", attach.attno,\
attach.filename,attach.fileextension,attach.projNo,attach.procNo,binData,attach.filename,attach.fileextension

    try:
        cursor.execute(MySQLdb.escape_string(sql_stmt))
        conn.commit()

attach.attcoll - это данные, поступающие через JSON из BLOB-объекта SQLite и кода Java на стороне клиента. Затем я хочу записать binData в MySQL с помощью MySQLdb, но продолжаю получать TypeError и код возврата 500. Любые идеи о том, как это исправить. Я хочу хранить binData в блобе MySQL.

1 Ответ

1 голос
/ 25 февраля 2011

Куча вещей здесь:

binData = ''.join(map(lambda x: chr(x % 256), attach.attcoll))
sql_stmt = """INSERT INTO attachments (attno,filename,fileextension,projNo,procNo,wpattachment)
VALUES (%s,%s,%s,%s,%s,%s) ON DUPLICATE KEY UPDATE filename=%s,fileextension=%s""" 

params = (attach.attno,attach.filename,attach.fileextension,attach.projNo,attach.procNo,binData,attach.filename,attach.fileextension)

cursor.execute(sql_stmt, params)
conn.commit()

Резюме:

  1. Сначала убедитесь, что вы подключены к БД (если вы не знаете, как это сделать,прочитайте документацию по MySQLdb)
  2. Вы не хотите экранировать весь свой запрос, только части данных, передавая оператор и данные отдельно в cursor.execute(), означает, что курсор уберет его для вас.
  3. Не цитируйте ваш '%s', MySQLdb делает это и для вас.
  4. Является ли ваша база данных транзакционной (т.е. InnoDB), поэтому вы используете conn.commit(), в этом нет необходимости, если выЯ использую транзакционный движок.
  5. Не видя, как вы структурировали свою таблицу БД, я не могу гарантировать, что это сработает.В качестве практики вы пытались создать действительно простую таблицу базы данных и практиковались в ее вставке с помощью MySQLdb, просто чтобы ознакомиться с API?
...