2010-08-04 14 views
8

इससे पहले कि आप सभी मुझे here और here पर इंगित करें, मेरा थोड़ा अलग है। इसलिए मैंने अपने उत्पादन सर्वर में स्थानांतरित होने के बाद प्रसिद्ध त्रुटि प्राप्त करना शुरू कर दिया।Django फ़िल्टरिंग MySQL चेतावनी

Django/db/बैकेंड/mysql/base.py: 86: चेतावनी: डाटा पंक्ति में स्तंभ 'स्लग' के लिए छोटा कर दिया 1

मैंने सोचा के बाद मैं तय इस googling शुरू हो गया था समस्या। इसे ठीक करने के लिए, मैंने दोनों मॉडलों को 128 विज्ञापन के अधिकतम_लेथेंस के लिए tweaked किया, फिर मिलान करने के लिए SQL तालिकाओं को अद्यतन किया। लेकिन समस्या बनी हुई .. कुछ हद तक आश्वस्त है कि मैंने वास्तव में समस्या को ठीक किया है, मुझे लगा कि मैं उन्हें फ़िल्टर करना शुरू कर दूंगा। तो मेरी लिपि के शीर्ष पर मैंने इसे रखा।

# Get rid of the MySQLdb warnings 
import warnings 
import MySQLdb 
with warnings.catch_warnings(): 
    warnings.filterwarnings("ignore", category=MySQLdb.Warning) 

और मैंने खुशी से उत्पादन के लिए इसे धक्का दिया। अनुमान लगाओ - आपने अनुमान लगाया कि समस्या बनी रही है। तो अब क्या। मैं जल्दी से विश्वास खो रहा हूं कि मैंने वास्तव में समस्या को ठीक किया है, लेकिन इसकी एक डबल जांच से पता चलता है कि सभी स्लग कॉलम 128 वर्ण लंबे हैं। इसके अलावा, अगर मैं 128 से अधिक लंबा हूं और अभी भी कुछ भी नहीं है तो मैं गलती से गलती कर दूंगा। तो 2 सवाल:

  1. मैं जकड़ना कैसे क्या आपरेशन इस पर चिह्नित करने है सकते हैं। यानी मेरे कोड में ध्वज उठाया जा रहा है?

  2. मैं वास्तव में इन्हें कैसे फ़िल्टर कर सकता हूं? मेरा फिक्स काम नहीं कर रहा है? क्या यह वास्तव में एक MySQLdb चेतावनी या django.db.mysql.base चेतावनी है?

धन्यवाद और खुश Django हैकिंग!

जो लोग संरचना पर प्रश्न पूछना चाहते हैं के लिए ..

CREATE TABLE `people_employee` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `name` varchar(100) DEFAULT NULL, 
    `email` varchar(75) DEFAULT NULL, 
    `location_id` varchar(100) DEFAULT NULL, 
    `jpeg` longtext, 
    `first_name` varchar(100) DEFAULT NULL, 
    `last_name` varchar(100) DEFAULT NULL, 
    `maildomain` varchar(32) DEFAULT NULL, 
    `mailserver` varchar(32) DEFAULT NULL, 
    `mailfile` varchar(64) DEFAULT NULL, 
    `contractor` tinyint(1) NOT NULL, 
    `temporary` tinyint(1) NOT NULL, 
    `formal_name` varchar(100) DEFAULT NULL, 
    `nickname` varchar(32) DEFAULT NULL, 
    `cell_phone` varchar(32) DEFAULT NULL, 
    `office_phone` varchar(32) DEFAULT NULL, 
    `other_phone` varchar(32) DEFAULT NULL, 
    `fax` varchar(32) DEFAULT NULL, 
    `assistant_id` int(11) DEFAULT NULL, 
    `supervisor_id` int(11) DEFAULT NULL, 
    `is_supervisor` tinyint(1) NOT NULL, 
    `department_id` varchar(100) DEFAULT NULL, 
    `division_id` varchar(100) DEFAULT NULL, 
    `section_id` varchar(100) DEFAULT NULL, 
    `job_classification_id` varchar(100) DEFAULT NULL, 
    `functional_area_id` varchar(100) DEFAULT NULL, 
    `position_id` varchar(100) DEFAULT NULL, 
    `notes_url` varchar(200) DEFAULT NULL, 
    `ldap_active` tinyint(1) NOT NULL, 
    `notes_active` tinyint(1) NOT NULL, 
    `created_at` datetime NOT NULL, 
    `last_update` datetime NOT NULL, 
    `is_active` tinyint(1) NOT NULL, 
    `site_id` int(11) NOT NULL, 
    `slug` varchar(128) DEFAULT NULL, 
    PRIMARY KEY (`id`), 
    UNIQUE KEY `slug` (`slug`), 
    KEY `people_employee_location_id` (`location_id`), 
    KEY `people_employee_assistant_id` (`assistant_id`), 
    KEY `people_employee_supervisor_id` (`supervisor_id`), 
    KEY `people_employee_department_id` (`department_id`), 
    KEY `people_employee_division_id` (`division_id`), 
    KEY `people_employee_section_id` (`section_id`), 
    KEY `people_employee_job_classification_id` (`job_classification_id`), 
    KEY `people_employee_functional_area_id` (`functional_area_id`), 
    KEY `people_employee_position_id` (`position_id`), 
    KEY `people_employee_site_id` (`site_id`) 
) ENGINE=MyISAM AUTO_INCREMENT=1429 DEFAULT CHARSET=latin1; 

और प्रासंगिक models.py।

slug = models.SlugField(max_length=128, editable=False, unique=True) 

आशा है कि मदद करता है ..

+0

क्षेत्र (रों) कर रहे हैं इस डेटा से है पाठ सीमाओं लगाया आ सकता है? –

+0

नहीं - मैं सहेजने पर स्लॉग सेट कर रहा हूं। यदि लंबाई है> मैं एक चेतावनी को दबा रहा हूं> 128 (लेकिन यह नहीं है ..)। – rh0dium

+0

क्या आप अपनी तालिका के 'वर्णन' (उत्पादन बॉक्स से) और जिस मॉडल का उपयोग कर रहे हैं उसका आउटपुट पोस्ट कर सकते हैं? –

उत्तर

3

सबसे पहले, मैं दृढ़ता से इस तरह छानने चेतावनी के खिलाफ की सलाह देते हैं: इस त्रुटि MySQL द्वारा उत्पन्न होता है और यह बिल्कुल मतलब है कि आप डेटा खो रहे हैं।

करने के लिए पहली बात यह सुनिश्चित करने के लिए MySQL वर्णन कमांड का उपयोग करेगा कि आपका डेटाबेस कॉलम वास्तव में उसी आकार के लिए परिभाषित किया गया है जिसे आप उम्मीद कर रहे हैं: यदि आप कॉलम की लंबाई बदलते हैं तो Django डेटाबेस माइग्रेशन के लिए कोई समर्थन नहीं है इसलिए यदि आपके स्लग क्षेत्र कभी कम की तुलना में यह अब है कि आप नए लंबाई सेट करने के लिए मैन्युअल रूप से तालिका में परिवर्तन करने की आवश्यकता होगी था: यदि उस क्षेत्र नहीं था कि तुम क्या आप बस से समस्या का समाधान हो सकता है की उम्मीद

mysql> DESCRIBE my_table slug; 
+-------+--------------+------+-----+---------+-------+ 
| Field | Type   | Null | Key | Default | Extra | 
+-------+--------------+------+-----+---------+-------+ 
| slug | varchar(255) | NO | UNI | NULL |  | 
+-------+--------------+------+-----+---------+-------+ 
1 row in set (0.00 sec) 

कॉलम की लंबाई अपडेट करना:

mysql> ALTER TABLE my_table MODIFY slug VARCHAR(255) NOT NULL; 

यदि आप अपने स्लग में यूनिकोड वर्णों को अनुमति देते हैं, तो यह भी समझा सकता है क्योंकि के बजाय latin1 वर्ण सेट का उपयोग करने के लिए उपरोक्त आपका डंप प्रतीत होता है - एक एकल यूटीएफ -8 वर्ण डेटा के 4 बाइट तक हो सकता है, जिसका अर्थ है कि एक मान 17 बाइट्स जितना छोटा हो सकता है VARCHAR(64) ओवरफ़्लो हो सकता है।

एक अगले डिबगिंग कदम कॉल पर एक साधारण भिन्नता आप चेतावनी फिल्टर करने के लिए यह पता लगाने की वह जगह है जहाँ अपने त्रुटियों हो रही हैं बना रहे है:

warnings.simplefilter("error", category=MySQLdb.Warning) 

इस घातक चेतावनी कर देगा, जो रुक जाएगा अपने कार्यक्रम, लेकिन अधिक महत्वपूर्ण बात यह भी एक स्टैकट्रस का उत्पादन करेगा। simplefilter कॉल के साथ

[email protected]:~ $ python test_warnings.py 
test_warnings.py:5: UserWarning: uhoh 
    warnings.warn("uhoh") 

: simplefilter कॉल बिना

#!/usr/bin/env python 
import warnings 

def foo(): 
    warnings.warn("uhoh") 

def bar(): 
    foo() 

def main(): 
    warnings.simplefilter("error", UserWarning) 
    bar() 

if __name__ == "__main__": 
    main() 

: कुछ इस तरह के साथ, आप नीचे दिए गए आउटपुट देखेंगे

[email protected]:~ $ python test_warnings.py 
Traceback (most recent call last): 
    File "test_warnings.py", line 15, in <module> 
    main() 
    File "test_warnings.py", line 12, in main 
    bar() 
    File "test_warnings.py", line 8, in bar 
    foo() 
    File "test_warnings.py", line 5, in foo 
    warnings.warn("uhoh") 
UserWarning: uhoh 
+0

वाह - पुनरुत्थान के बारे में बात करो! अच्छी नौकरी! मैंने इसे पहले ही हल कर लिया था (इस साइट को अपडेट करने में विफल रहा)। यह यूटीएफ -8/लैटिन मुद्दा था जिसका आपने उल्लेख किया था। यह कितना पिटा था इसे ढूंढना था। यद्यपि यहाँ महान संकेत! – rh0dium

1

मैं अपने प्रोजेक्ट के settings.py संपादित करेंगे इस व्यवहार को मेरे पूरे django प्रोजेक्ट में होने दें। अन्यथा, मैं बस इसे स्क्रिप्ट के एक हिस्से में शामिल कर सकता हूं जहां मैं यह व्यवहार करना चाहता हूं।


त्रुटियों के रूप में बढ़ाएं MySQL चेतावनी:

import warnings, MySQLdb 
warnings.filterwarnings('error', category=MySQLdb.Warning) 

बजाय एक त्रुटि जुटाने की उपेक्षा करने के लिए, "ignore" साथ "error" बदलें।

उन में संभाल एक कोशिश को छोड़कर ब्लॉक की तरह:

try: 
    # a MySQL DB operation that raises a warning 
    # for example: a data truncated warning 
except Warning as a_warning: 
    # do something here 
संबंधित मुद्दे