2011-02-24 135 views
1

我已经搜索并搜索了这个网站,但没有具体的出现,不能得到这个工作。下面是代码:保存二进制数据到MySQLdb - Python

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是,从一个SQLite blob和Java代码在客户端来在超过JSON数据。然后,我想用MySQLdb将binData写入MySQL,但不断收到TypeError和500的返回码。关于如何解决这个问题的任何想法。我想将binData存储到一个MySQL blob中。

回答

1

的一堆东西在这里:

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了?
+0

1.我连接... 2.有趣... 3.不执行没有这些单引号......根本没有。将再试一次。 4.除此之外...这个问题是非常具体的'如何最好地存储blob /二进制数据'。我连接,如果我从脚本中消除binData,所有工作正常 - 甚至用单引号。这个问题是孤立的,因为所有其他因素都被考虑在内。 任何帮助非常感谢。 – kirtcathey 2011-02-25 00:09:44

+0

好的只是检查。有很多你的查询错误,所以想确保你熟悉MySQLdb并覆盖所有我能想到的基础 – 2011-02-25 00:11:51

+0

我不明白它是如何工作正常,当你逃避你的整个查询,此外,根据你的代码sql_stmt不是一个字符串,它是一个元组,MySQLdb.escape_string()在给出元组时引发异常。 – 2011-02-25 00:18:07