8

私が受け取ったエラーメッセージは

Traceback (most recent call last):
  File "./test.py", line 416, in <module>
    startup()
  File "./test.py", line 275, in startup
    writer.save(r,data) 
  File "/home/user/project/test/output.py", line 91, in save
    self.save_doc(r, data, pid)
  File "/home/user/project/test/output.py", line 130, in save_doc
    cursor.execute(dbquery)
  File "/usr/local/lib/python2.6/site-packages/django/db/backends/util.py", line 34, in execute
    return self.cursor.execute(sql, params)
  File "/usr/local/lib/python2.6/site-packages/django/db/backends/mysql/base.py", line 86, in execute
    return self.cursor.execute(query, args)
  File "/usr/local/lib/python2.6/site-packages/MySQL_python-1.2.3c1-py2.6-linux-x86_64.egg/MySQLdb/cursors.py", line 175, in execute
  File "/usr/local/lib/python2.6/site-packages/MySQL_python-1.2.3c1-py2.6-linux-x86_64.egg/MySQLdb/cursors.py", line 89, in _warning_check
_mysql_exceptions.Warning: Data truncated for column 'url' at row 1

最初に確認したのは、URL文字列がフィールドの長さよりも長いかどうかですが、実際にははるかに短いです。データベース設計

+----------+-------------------------------------------------------------------+
| Database | Create Database                                                   |
+----------+-------------------------------------------------------------------+
| myurlcol | CREATE DATABASE `myurlcol` /*!40100 DEFAULT CHARACTER SET utf8 */ | 
+----------+-------------------------------------------------------------------+

テーブルデザイン

  CREATE TABLE `document` (
  `id` int(11) NOT NULL auto_increment,
  `url` varchar(255) collate utf8_bin NOT NULL,
  `md5` varchar(32) collate utf8_bin NOT NULL,
  `host` varchar(255) collate utf8_bin default NULL,
  `content_sha1` varchar(40) collate utf8_bin NOT NULL,
  `add_date` datetime NOT NULL,
  PRIMARY KEY  (`id`),
  UNIQUE KEY `url` (`url`),
  UNIQUE KEY `md5` (`md5`),
  KEY `main_crawl_document_content_sha1` (`content_sha1`),
  KEY `main_crawl_document_discover_date` (`add_date`),
  KEY `main_crawl_document_host` (`host`),
  ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

テーブルに挿入しようとしているデータの長さを出力します(1つのURLのみを使用してテストしています)。

len(url) =  89
len(md5) =  32
len(host) =  20
len(content_sha1) =  40
len(add_date) =  19

Django.db.connectionによって作成されたカーソルを使用していました。さらに情報を提供するために、渡した完全なデータベースクエリコマンドを貼り付けますcursor.execute()

INSERT INTO main_document SET url='ftp://ftp.ncbi.nlm.nih.gov/pub/pmc/0a/39/Arthritis_Res_2000_Jun_5_2%284%29_315-326.tar.gz',md5='b6ba3adde8de87e4dc255092b04d07ea',host='ftp.ncbi.nlm.nih.gov',content_sha1='9aeab4412cc9b1add84a6d2bca574664e193b56e',add_date='2012-05-15 00:00:00';

面白いことに、上記のコマンドは、MySQLコマンドラインにコピーして貼り付けると機能します。エラーメッセージは表示されず、データは正しく挿入されます。

何が問題になっていますか?

4

2 に答える 2

1

cursor.execute正しく使用すれば、MySQL エスケープを処理します。ここにいくつかの例

基本的な考え方は、%s現在生の値を含めている生の SQL 文字列で使用し、値cursor.execute()のタプル (または配列) である 2 番目の引数を順番に渡すことです。あなたの場合、これは次のようになります。

url = 'ftp://ftp.ncbi.nlm.nih.gov/pub/pmc/0a/39/Arthritis_Res_2000_Jun_5_2%284%29_315-326.tar.gz'
md5 = 'b6ba3adde8de87e4dc255092b04d07ea'
host = 'ftp.ncbi.nlm.nih.gov'
content_sha1 = '9aeab4412cc9b1add84a6d2bca574664e193b56e'
add_date = '2012-05-15 00:00:00'
sql = "INSERT INTO main_document SET url = %s, md5 = %s, host = %s, content_sha1 = %s, add_date = %s"
cursor.execute(sql, (url, md5, host, content_sha1, add_date))
于 2014-11-25T07:40:00.267 に答える
0

データベースに挿入する前に、URL 文字列の引用符urllib.unquote(url)外してみてください。文字列に出現する引用符文字マーカー % は、MySQL の特殊文字であり、トランザクションを台無しにする可能性があります。

あなたの挿入物は読むべきです:

INSERT INTO main_document SET url='ftp://ftp.ncbi.nlm.nih.gov/pub/pmc/0a/39/Arthritis_Res_2000_Jun_5_2(4)_315-326.tar.gz',md5='b6ba3adde8de87e4dc255092b04d07ea',host='ftp.ncbi.nlm.nih.gov',content_sha1='9aeab4412cc9b1add84a6d2bca574664e193b56e',add_date='2012-05-15 00:00:00';

MySQL は、パターン マッチング コンテキストでのみ % を特別なものとして扱うことに注意してください。したがって、Django ORM には最終的に何か問題がある可能性があります。

于 2012-07-24T20:54:05.247 に答える