2013-04-16 3 views
14

मैं Django टिप्पणियाँ मॉडल में बनाया गया है पर एक साधारण क्वेरी और Heroku के PostgreSQL डेटाबेस के साथ नीचे त्रुटि हो रही है:heroku, postgreSQL, django, टिप्पणियां, tastypie: कोई ऑपरेटर दिए गए नाम और तर्क प्रकार से मेल खाता है। आप स्पष्ट प्रकार जोड़ने के लिए आवश्यकता हो सकती है डाले

DatabaseError: operator does not exist: integer = text LINE 1: 
... INNER JOIN "django_comments" ON ("pi ns_pin"."id" = "django_... 
                 ^
HINT: No operator matches the given name and argument type(s). 
You might need to add explicit type casts. 

इसके चारों ओर googling के बाद इस त्रुटि कई बार संबोधित किया गया है लगता है django में पहले, लेकिन मुझे अभी भी यह मिल रहा है (सभी संबंधित मुद्दों को 3-5 साल पहले बंद कर दिया गया था)। मैं django संस्करण 1.4 और tastypie का नवीनतम निर्माण का उपयोग कर रहा हूँ।

क्वेरी ORM फिल्टर के तहत किए गए और मेरे विकास डेटाबेस (sqlite3) के साथ पूरी तरह से काम करता है:

class MyResource(ModelResource):  

    comments = fields.ToManyField('my.api.api.CmntResource', 'comments', full=True, null=True) 

    def build_filters(self, filters=None): 
     if filters is None: 
      filters = {} 

     orm_filters = super(MyResource, self).build_filters(filters) 

     if 'cmnts' in filters: 
      orm_filters['comments__user__id__exact'] = filters['cmnts'] 

class CmntResource(ModelResource): 
    user = fields.ToOneField('my.api.api.UserResource', 'user', full=True) 
    site_id = fields.CharField(attribute = 'site_id') 
    content_object = GenericForeignKeyField({ 
     My: MyResource, 
    }, 'content_object') 
    username = fields.CharField(attribute = 'user__username', null=True) 
    user_id = fields.CharField(attribute = 'user__id', null=True) 

किसी कच्चे एसक्यूएल लेखन के बिना इस त्रुटि के आसपास हो रही है के साथ किसी भी अनुभव है?

+0

त्रुटि की तरह कहता है, आप टेक्स्ट मान पर एक पूर्णांक की तुलना करने की कोशिश कर रहे हैं। ऐसा करना बंद करो और त्रुटि दूर हो जाएगी। –

+0

संयोग से, यह एक अच्छा उदाहरण है कि पर्यावरण के साथ परीक्षण क्यों किया जाना चाहिए, जहां आप तैनात कर सकते हैं: हालांकि बहुत से ढांचे पर इसका सार है, डीबीएमएस के रूप में जटिल कुछ अलग व्यवहार और सीमाएं हैं । – IMSoP

+0

आईएमएसओपी, हाँ वास्तव में मैंने आज सबक सीखा! इस मुद्दे पर काम करने के लिए बस मेरे विकास डीबी को PostgreSQL पर बदल दिया। – arctelix

उत्तर

4

आईएमएसओपी के उत्तर पर बिल्डिंग: यह डीजेंगो की ओआरएम परत की सीमा है जब एक जेनेरिक विदेशी कुंजी ऑब्जेक्ट_आईडी के लिए टेक्स्ट फ़ील्ड का उपयोग करती है और ऑब्जेक्ट का आईडी फ़ील्ड टेक्स्ट फ़ील्ड नहीं है। Django किसी भी धारणा नहीं करना चाहता है या ऑब्जेक्ट की आईडी को ऐसा कुछ नहीं करना चाहता है जैसा वह नहीं है। मुझे इस http://charlesleifer.com/blog/working-around-django-s-orm-to-do-interesting-things-with-gfks/ पर एक उत्कृष्ट लेख मिला।

लेख के लेखक, चार्ल्स लीफर इस प्रश्न से प्रभावित होने वाले प्रश्नों के लिए बहुत ही अच्छे समाधान के साथ आए और इस मुद्दे से आगे बढ़ने में बहुत उपयोगी होंगे।

वैकल्पिक रूप से, मैं इस प्रकार के रूप में काम करने के लिए अपनी क्वेरी पाने में कामयाब रहे:

if 'cmnts' in filters: 
    comments = Comment.objects.filter(user__id=filters['cmnts'], content_type__name = 'my', site_id=settings.SITE_ID).values_list('object_pk', flat=True) 
    comments = [int(c) for c in comments] 
    orm_filters['pk__in'] = comments 

मूल रूप से मैं एक तरह से एसक्यूएल क्या चार्ल्स किया है के लिए इसी तरह संशोधित करने के लिए खोज रहा था, लेकिन यह सब मैं करना पड़ा पता चला है दो भागों में क्वेरी को तोड़ दिया गया था और str (id) के int (id) में कनवर्ट किया गया था।

29

पोस्टग्रेएसक्यूएल "दृढ़ता से टाइप किया गया" है - यानी, प्रत्येक क्वेरी में प्रत्येक मान का एक विशेष प्रकार होता है, या तो स्पष्ट रूप से परिभाषित किया जाता है (उदाहरण के लिए किसी तालिका में कॉलम का प्रकार) या निहित रूप से (उदाहरण के लिए WHERE खंड में मान इनपुट) । = समेत सभी फ़ंक्शंस और ऑपरेटरों को विशिष्ट प्रकारों को स्वीकार करने के रूप में परिभाषित किया जाना चाहिए - उदाहरण के लिए, VarChar = VarChar के लिए एक ऑपरेटर है, और के लिए एक अलग है।

आपके मामले में, आपके पास एक कॉलम है जिसे स्पष्ट रूप से टाइप int के रूप में परिभाषित किया गया है, लेकिन आप इसे उस मान के साथ तुलना कर रहे हैं जो PostgreSQL ने text टाइप किया है।

दूसरी तरफ, SQLite, "कमजोर टाइप किया गया" है - मूल्यों का स्वतंत्र रूप से कार्य किया जा रहा है जो कि कार्रवाई के सर्वोत्तम प्रकार के अनुरूप होता है। तो आपके dev SQLite डेटाबेस में ऑपरेशन '42' = 42 को ठीक से गणना की जा सकती है, जहां PostgreSQL को VarChar = int (या text = int, text की विशिष्ट परिभाषा की आवश्यकता होगी PostgreSQL में असंबद्ध तारों के प्रकार के रूप में)।

अब, PostgreSQL कभी कभी उपयोगी और स्वचालित रूप से अपने मूल्यों "डाली" प्रकार एक ज्ञात ऑपरेटर मिलान करने के लिए, लेकिन अधिक बार, के रूप में संकेत कहते हैं, आप इसे स्पष्ट रूप से करने की जरूरत है। यदि आप स्वयं SQL को लिख रहे थे, तो एक स्पष्ट प्रकार का केस WHERE id = CAST('42' AS INT) (या WHERE CAST(id AS text) = '42') जैसा दिख सकता है।

चूंकि आप नहीं हैं, इसलिए आपको यह सुनिश्चित करने की आवश्यकता है कि आप क्वेरी जेनरेटर को जो इनपुट देते हैं वह एक वास्तविक पूर्णांक है, न केवल एक स्ट्रिंग जो अंक के साथ होता है। मुझे संदेह है कि fields.CharField की बजाय fields.IntegerField का उपयोग करना उतना आसान है, लेकिन मुझे वास्तव में Django, या यहां तक ​​कि पायथन भी नहीं पता है, इसलिए मैंने सोचा कि मैं आपको आशा से पृष्ठभूमि दूंगा कि आप इसे वहां से ले जा सकते हैं।

+0

जानकारी के लिए धन्यवाद, बहुत अच्छी तरह से रखा गया है और मैं समझता हूं कि त्रुटि का कारण क्या है। मुद्दा यह है कि टिप्पणियों के मॉडल के लिए django का gfk object_id के लिए एक टेक्स्ट फ़ील्ड का उपयोग करता है और ऑब्जेक्ट पर एक पूर्णांक फ़ील्ड का उपयोग करने पर टिप्पणी की जा रही है .. तो वास्तव में खोज यह होना चाहिए कि मैं टिप्पणी मॉडल को पूर्णांक को सीमित किए बिना कैसे प्राप्त करूं आईडी की। – arctelix

0

आपको ओआरएम और बाहरी सॉफ़्टवेयर पोस्टग्रेज़ को हैक करने के लिए आपको अपने स्वयं के कलाकार पंजीकृत करने और संचालन की तुलना करने की अनुमति नहीं है। Please look example in similar question

संबंधित मुद्दे

 संबंधित मुद्दे