2010-07-21 18 views
6

मैं एक पायथन दुभाषिया से निम्नलिखित कोड चलाता हूं, और सम्मिलित कथन विफल होने की उम्मीद करता हूं और किसी प्रकार का अपवाद फेंक देता हूं। लेकिन यह नहीं हो रहा है:मेरी sqlite3 विदेशी कुंजी क्यों काम नहीं कर रही हैं?

Python 2.6.5 (r265:79096, Mar 19 2010, 21:48:26) [MSC v.1500 32 bit (Intel)] on win32 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import sqlite3 
>>> conn = sqlite3.connect("test.db") 
>>> conn.executescript(""" 
... pragma foreign_keys=on; 
... begin transaction; 
... create table t1 (i integer primary key, a); 
... create table t2 (i, a, foreign key (i) references t1(i)); 
... commit; 
... """) 
<sqlite3.Cursor object at 0x0229DAA0> 
>>> c = conn.cursor() 
>>> c.execute("insert into t2 values (6, 8)") 
<sqlite3.Cursor object at 0x0229DAD0> 
>>> #??? 
... 
>>> conn.commit() 
>>> #??????????? 
... 
>>> c.execute("select * from t2") 
<sqlite3.Cursor object at 0x0229DAD0> 
>>> c.fetchall() 
[(6, 8)] 
>>> #but why!? 
... 
>>> 

क्या किसी को पता है कि यह क्यों काम नहीं करना चाहता? मेरी समझ यह है कि डालने में असफल होना चाहिए क्योंकि t2(i) के लिए दिए गए मान t1 में प्राथमिक कुंजी नहीं है, लेकिन यह खुशी से वैसे भी करता है ...?

उत्तर

10

SQLite में काम कर रहे विदेशी कुंजी का समर्थन बहुत नया है - इसे केवल 14 अक्टूबर को 3.6.1 9 में रिलीज़ किया गया था। क्या आप वाकई SQLite 3.6.19 या बाद में उपयोग कर रहे हैं?

sqlite3 मॉड्यूल में sqlite_version निरंतर जांचें। जैसे डिफ़ॉल्ट अजगर/SQLite के साथ एक मैक ओएस एक्स 10.6 सिस्टम पर स्थापित:

>>> import sqlite3 
>>> sqlite3.sqlite_version 
'3.6.12' 
>>> 
+0

मैं यह कहने जा रहा था कि मुझे चाहिए, क्योंकि मैं इसे स्क्लाइट इंटरेक्टिव दुभाषिया के साथ काम करने के लिए प्राप्त कर सकता हूं, लेकिन तब मुझे एहसास हुआ कि पाइथन का अपना स्क्लाइट बनाया गया है - मेरे सिस्टम पर एक नया होना चाहिए लेकिन अंदर नहीं मेरा अजगर धन्यवाद –

+0

आह, आप सही थे, मेरे पास 3.5.9 है। –

2

के रूप में निकोलस ने कहा, जांच लें कि SQLite के अपने संस्करण के विदेशी कुंजी समर्थन हासिल है। इससे कोई फर्क नहीं पड़ता कि स्क्लाइट का संस्करण 3.6.1 9 से अधिक या उसके बराबर है। स्रोत को विदेशी कुंजी समर्थन के साथ संकलित किया जा सकता है। निम्न आदेश निष्पादित करने के लिए जांचें।

cursor.execute("PRAGMA foreign_keys")

यदि यह कोई डेटा नहीं लौटाता है तो आपके संस्करण का कोई विदेशी कुंजी समर्थन नहीं है।

एनबी: विदेशी कुंजी समर्थन अब तक SQLite3 में लागू नहीं किया गया है। here देखें।

+1

क्या यह नहीं है? स्क्लाइट 3.8.10 में ऐसा लगता है कि –

+0

पर विदेशी_कीज प्रगामा चालू हो गया है, यह उनके दस्तावेज़ों के मुताबिक नहीं है। अभी तक मुझे शक करने का कोई कारण नहीं मिला है, क्योंकि मेरा डीबी ऐसा ही व्यवहार करता है। वैसे भी मैं संस्करण 3.8.10 देखेंगे। – Charitoo

+1

मैंने इसे अपने पायथन 3.5 इंस्टॉलेशन के एसक्लाइट 3 मॉड्यूल (जो 3.8.11 का उपयोग करता है) के साथ करने की कोशिश की और विदेशी कुंजी बाधाएं भी समर्थित हैं। उल्लंघन करना मुझे एक 'sqlite3 देता है। इंटेग्रिटी त्रुटि: विदेशी कुंजी बाधा विफल' –

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