অদ্ভুত SQLAlchemy ত্রুটি বার্তা: প্রকারের ত্রুটি: 'ডিক' অবজেক্ট ইনডেক্সিং সমর্থন করে না


145

আমি স্কিলএলচেমি ব্যবহার করে একটি পিজি ডাটাবেস থেকে ডেটা আনার জন্য হ্যান্ড কার্ফ্ট করা এসকিউএল ব্যবহার করছি। আমি একটি ক্যোয়ারির চেষ্টা করছি যাতে অপারেটর '%' এর মতো এসকিউএল রয়েছে এবং এটি SQLlcjhemy কে একটি লুপের মাধ্যমে ফেলে দেবে বলে মনে হচ্ছে:

sql = """
       SELECT DISTINCT u.name from user u
        INNER JOIN city c ON u.city_id = c.id
        WHERE c.designation=upper('fantasy') 
        AND c.id IN (select id from ref_geog where short_name LIKE '%opt')
      """

# The last line in the above statement throws the error mentioned in the title. 
# However if the last line is change to:
# AND c.id IN (select id from ref_geog where short_name = 'helloopt')
# the script runs correctly.
#
# I also tried double escaping the '%' i.e. using '%%' instead - that generated the same error as previously.

connectDb()
res = executeSql(sql)
print res
closeDbConnection()

এই বিভ্রান্তিকর ত্রুটি বার্তার কারণ কী ঘটছে তা যে কেউ জানেন এবং আমি কীভাবে এটি ঠিক করতে পারি?

[[সম্পাদনা]]

কেউ জিজ্ঞাসা করার আগে, উপরে অন্তর্ভুক্ত ফাংশনগুলি সম্পর্কে বিশেষ বা অভিনব কিছু নেই। উদাহরণস্বরূপ ফাংশন এক্সিকিউটএসকিউএল () কেবল কান.এক্সেকিউট (এসকিউএল) ডাকে এবং ফলাফলগুলি প্রদান করে। পরিবর্তনশীল সংযোগটি সহজেই ডাটাবেসের সাথে পূর্ববর্তী প্রতিষ্ঠিত সংযোগ।


আপনি কি কোড পোস্ট করতে পারেন executeSql(...)? এবং এছাড়াও, আপনি কি সত্যিই আছে RETURNING *SELECTবক্তব্য?
ভ্যান

@ আমি এটি মিস করেছি এসকিউএলে কোনও 'রিটার্নিং *' নেই যা সমস্যার সৃষ্টি করছে। আমি প্রশ্ন সংশোধন করব।
হোমমানকুলাস রেটিকুলি

1
এই উত্তরটি [ স্ট্যাকওভারফ্লো.com/ প্রশ্নগুলি / 3944276/… সহায়ক?
ভ্যান

2
@ ওয়ান: ধন্যবাদ! হ্যাঁ এটা করে. আমাকে '%' এর পরিবর্তে '\ %%' ব্যবহার করতে হয়েছিল। বিবৃতিটি এখন সঠিকভাবে কার্যকর করা হয়েছে।
হোমানকুলাস রেটিকুলি

3
মহান। দয়া করে একটি সংক্ষিপ্ত উত্তর পোস্ট করুন (এবং এটি স্বীকার করুন) যা সম্পূর্ণতার জন্য আপনার পক্ষে কাজ করেছে।
ভ্যান

উত্তর:


227

আপনাকে %%এটি ব্যবহার করতে হবে %কারণ %পাইথনে স্ট্রিং ফর্ম্যাটিং হিসাবে ব্যবহার করা হয় তাই আপনি যখন একক লেখেন তখন %অনুমান করুন যে আপনি এর সাথে কিছু মান প্রতিস্থাপন করতে চলেছেন।

সুতরাং আপনি যখন %ক্যোয়ারির সাথে একক স্ট্রিং রাখতে চান তখন সর্বদা দ্বিগুণ করুন %


27
আমি আশা করি তারা এই ত্রুটি বার্তাটি আপডেট করে দিতেন,
যতবারই

86

এসকিউএলএলচেমির text()পাঠ্য মোড়ানোর জন্য একটি ফাংশন রয়েছে যা আপনার জন্য এসকিউএলকে সঠিকভাবে এড়িয়ে চলেছে ।

অর্থাত

res = executeSql(sqlalchemy.text(sql))

আপনার জন্য কাজ করা উচিত এবং ম্যানুয়াল পলায়ন থেকে আপনাকে বাঁচানো উচিত।


13
এটি নির্বাচিত উত্তর হওয়া উচিত। এটি আমার ক্ষেত্রে বিষয়টি সমাধান করেছে।
গণি সিমসেক

1
দ্রষ্টব্য যে এটি মন্তব্যগুলি এড়ায় না, তবে অন্যথায় এটি একটি দুর্দান্ত সমাধান।
ক্লাইমব্রোকস

এটি আমার পক্ষে কাজ করেছিল এবং আমাদের সমস্ত প্রশ্নের দ্বিগুণ% পরিবর্তনের চেয়ে প্রয়োগ করা সহজ ছিল
ফিলিপ ওগার


4

দেখে মনে হচ্ছে আপনার সমস্যাটি এই বাগের সাথে সম্পর্কিত হতে পারে ।

কোন ক্ষেত্রে, আপনার কর্মসংস্থান হিসাবে ট্রিপল-পলায়ন করা উচিত।


2

এই ত্রুটিটি প্রদর্শিত হলে আমি আরও একটি মামলা পেয়েছি:

c.execute("SELECT * FROM t WHERE a = %s")

অন্য কথায়, আপনি যদি কোয়েরিতে প্যারামিটার ( %s) সরবরাহ করেন তবে আপনি কোয়েরি প্যারামগুলি যুক্ত করতে ভুলে যান। এই ক্ষেত্রে ত্রুটি বার্তাটি খুব বিভ্রান্তিকর।


1

আরও একটি নোট- আপনাকে অবশ্যই %মন্তব্যে অক্ষরগুলি পালাতে হবে (বা মুছতে হবে) । দুর্ভাগ্যক্রমে, sqlalchemy.text(query_string)মন্তব্যে শতকরা চিহ্নগুলি এড়ায় না।


1

আপনার সমস্যা সমাধানের আর একটি উপায়, আপনি যদি %চরিত্রগুলি বা ব্যবহার থেকে বাঁচতে না চান তবে sqlalchemy.text()একটি নিয়মিত অভিব্যক্তি ব্যবহার করা।

পরিবর্তে:

select id from ref_geog where short_name LIKE '%opt'

চেষ্টা করুন (কেস-সংবেদনশীল ম্যাচের জন্য):

select id from ref_geog where short_name ~ 'opt$' 

বা (কেস-সংবেদনশীলতার জন্য):

select id from ref_geog where short_name ~* 'opt$'

প্যাটার্ন মিলেরLIKE ক্ষেত্রে ডকুমেন্টেশনে উভয় এবং রেজেক্স আচ্ছাদিত ।

মনে রাখবেন যে:

LIKE নিদর্শনগুলির বিপরীতে, নিয়মিত প্রকাশটি স্ট্রিংয়ের শুরুতে বা শেষের দিকে স্পষ্টভাবে নোঙ্গর না করা না হলে স্ট্রিংয়ের মধ্যে যে কোনও জায়গায় মিলে যাওয়ার অনুমতি দেওয়া হয়।

অ্যাঙ্কারের জন্য, আপনি $স্ট্রিংয়ের শেষের জন্য (বা ^শুরু করার জন্য) এডিশনটি ব্যবহার করতে পারেন ।


0

এটি কেস থেকেও হতে পারে - এসকিউএল পাস করার ক্ষেত্রে প্যারামিটারগুলি ডিআইসিটি ফরমেটে ঘোষণা করা হয় এবং এসকিউএলে লিস্ট বা টিপল আকারে ম্যানিপুলেট করা হয়।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.