मैं केवल पढ़ने-लिखने के लिए SQLite डेटाबेस को कैसे बदल सकता हूं?
जब मैंने अपडेट स्टेटमेंट निष्पादित किया, तो मुझे हमेशा मिला:
SQL त्रुटि: एक आसानी से डेटाबेस लिखने का प्रयास
SQLite फ़ाइल फ़ाइल सिस्टम पर एक लेखन योग्य फ़ाइल है।
मैं केवल पढ़ने-लिखने के लिए SQLite डेटाबेस को कैसे बदल सकता हूं?
जब मैंने अपडेट स्टेटमेंट निष्पादित किया, तो मुझे हमेशा मिला:
SQL त्रुटि: एक आसानी से डेटाबेस लिखने का प्रयास
SQLite फ़ाइल फ़ाइल सिस्टम पर एक लेखन योग्य फ़ाइल है।
जवाबों:
इस त्रुटि संदेश के कई कारण हो सकते हैं:
कई प्रक्रियाओं में एक ही समय में डेटाबेस खुला होता है ( FAQ देखें )।
डेटाबेस को संपीड़ित और एन्क्रिप्ट करने के लिए एक प्लगइन है। यह DB को संशोधित करने की अनुमति नहीं देता है।
अंत में, एक अन्य FAQ कहता है: "सुनिश्चित करें कि डेटाबेस फ़ाइल वाली निर्देशिका भी CGI स्क्रिप्ट को निष्पादित करने वाले उपयोगकर्ता के लिए उपयुक्त है।" मुझे लगता है कि यह इसलिए है क्योंकि इंजन को डायरेक्टरी में अधिक फाइल बनाने की आवश्यकता है।
पूरे फाइल सिस्टम को केवल दुर्घटना के बाद उदाहरण के लिए पढ़ा जा सकता है।
यूनिक्स प्रणालियों पर, एक अन्य प्रक्रिया पूरी फ़ाइल को बदल सकती है।
मैंने इसे सभी फाइलों पर / db dir पर रूट से मालिक को बदलकर हल किया।
बस ls -l
उस फ़ोल्डर पर करते हैं , अगर किसी भी फाइलर के स्वामित्व में है root
, तो इसे केवल आपको बदलकर, उपयोग करके:sudo chown user file
यह त्रुटि आमतौर पर तब होती है जब आपका डेटाबेस पहले से ही एक एप्लिकेशन द्वारा एक्सेस किया जाता है, और आप इसे किसी अन्य एप्लिकेशन के साथ एक्सेस करने का प्रयास कर रहे हैं।
अगर Android का उपयोग कर रहे हैं।
सुनिश्चित करें कि आपने अपने EXTERNAL_STORAGE
को लिखने की अनुमति जोड़ दी हैAndroidManifest.xml
।
इस लाइन को AndroidManifest.xml
अपने <application>
टैग के ऊपर और बाहर अपनी फ़ाइल में जोड़ें ।
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
यह आपके एप्लिकेशन को sdcard को लिखने की अनुमति देगा। यह मदद करेगा यदि आपका EXTERNAL_STORAGE
वह स्थान है जहां आपने अपने डेटाबेस को डिवाइस पर संग्रहीत किया है।
लिनक्स कमांड शेल में, मैंने किया:
chmod 777 <db_folder>
जहाँ डेटाबेस फ़ाइल है।
यह काम करता हैं। अब मैं अपने डेटाबेस को एक्सेस कर सकता हूं और इंसर्ट कर सकता हूं।
(यह त्रुटि संदेश आम तौर पर भ्रामक है, और आमतौर पर एक सामान्य अनुमति त्रुटि है)
विंडोज पर
लिनक्स पर, डेटाबेस फ़ाइल वाले पूरे फ़ोल्डर को पढ़ने / लिखने की अनुमति दें।
इसके अलावा, SELinux लेखन को अवरुद्ध कर सकता है। आपको सही अनुमतियां सेट करने की आवश्यकता है।
मेरे SELinux Management GUI (फेडोरा 19 पर) में, मैंने httpd_unified (सभी सामग्री फ़ाइलों के HTTPD हैंडलिंग को यूनिफ़ाइड लेबल) पर बॉक्स को चेक किया, और मैं जाने के लिए अच्छा था।
व्यक्तिगत अनुभव साझा करने के लिए मुझे इस त्रुटि का सामना करना पड़ा जो अंततः दोनों को ठीक करता है। आवश्यक रूप से आपके मुद्दे से संबंधित नहीं हो सकता है, लेकिन ऐसा प्रतीत होता है कि यह त्रुटि इतनी सामान्य है कि इसे गज़िलियन चीजों के लिए जिम्मेदार ठहराया जा सकता है।
डेटाबेस उदाहरण एक अन्य अनुप्रयोग में खुला। मेरा DB एक "लॉक" अवस्था में रहा है, इसलिए यह केवल मोड पढ़ने के लिए संक्रमण करता है। मैं DB साझा करने वाले एप्लिकेशन का दूसरा उदाहरण रोककर इसे ट्रैक करने में सक्षम था।
निर्देशिका ट्री अनुमति - कृपया सुनिश्चित करें कि उपयोगकर्ता खाते की अनुमति न केवल फ़ाइल स्तर पर बल्कि पूरे ऊपरी निर्देशिका स्तर पर सभी स्तर / स्तर तक है।
धन्यवाद
उबंटू पर, मालिक को अपाचे समूह में बदलें और सही अनुमति दें (नहीं, यह 777 नहीं है):
sudo chgrp www-data <path to db.sqlite3>
sudo chmod 664 <path to db.sqlite3>
अपडेट करें
आप समूह और उपयोगकर्ता के लिए अनुमतियाँ भी सेट कर सकते हैं ।
sudo chown www-data:www-data <path to db.sqlite3>
कमांड लाइन से, उस फ़ोल्डर में प्रवेश करें जहां आपकी डेटाबेस फ़ाइल स्थित है और निम्नलिखित कमांड निष्पादित करें:
chmod 777 databasefilename
यह सभी उपयोगकर्ताओं को सभी अनुमतियां प्रदान करेगा।
विंडोज पर:
tl; dr: फ़ाइल को फिर से खोलने का प्रयास करें।
हमारा सिस्टम इस समस्या को झेल रहा था, और यह निश्चित रूप से एक अनुमति मुद्दा नहीं था, क्योंकि कार्यक्रम ही डेटाबेस को कई थ्रेड्स से अधिकांश समय के लिए लिखने योग्य बनाने में सक्षम होगा, लेकिन कभी-कभी (केवल विंडोज़ पर, ओएसएक्स पर नहीं), एक सूत्र को ये त्रुटियां मिलेंगी, जबकि कार्यक्रम के अन्य सभी सूत्र में कोई कठिनाई नहीं थी।
हमने अंततः पता लगाया कि जो थ्रेड फेल हो रहे थे, केवल वे ही थे जो डेटाबेस को खोलने की कोशिश कर रहे थे कि एक और धागा बंद हो जाने के तुरंत बाद (केवल 1 एमएस के भीतर)। हमने अनुमान लगाया कि समस्या इस तथ्य के कारण थी कि विंडोज (या विंडोज़ के तहत साइक्लाईट कार्यान्वयन) हमेशा फ़ाइल के बंद होने पर फ़ाइल संसाधनों को तुरंत साफ नहीं करता है। खोलने के बाद db के खिलाफ टेस्ट राइट क्वेरी चलाकर हमने इसे प्राप्त किया (जैसे, तब एक मूर्खतापूर्ण नाम के साथ एक टेबल को छोड़ना)। यदि बनाने / छोड़ने में विफल रहा, तो हमने 50 एमएस के लिए इंतजार किया और दोबारा कोशिश की, जब तक कि हम सफल नहीं हुए या 5 सेकंड बीत गए।
इसने काम कर दिया; जाहिर है कि डिस्क में फ्लश करने के लिए संसाधनों के लिए पर्याप्त समय होना चाहिए।
डीबी को संपादित करें: मुझे db को संपादित करने में समस्या आ रही थी। मैंने
'नॉन रूट यूज़रनेम' ts3server.sqlitedb को सुडो चाउन करवाया
जब तक यह रूट नहीं था, तब तक मैं था, मैं फाइल को एडिट कर सकता था। उपयोगकर्ता नाम मेरे गैर रूट खाते का उपयोगकर्ता नाम है।
स्वतः प्रारंभ टीमस्पीक: अपने नॉन रूट खाते
crontab -e
@reboot / पथ के रूप में ts3server / aka /home/ts3server/ts3server_startscript.sh start
प्रोजेक्ट पथ में टर्मिनल django_project #
sudo chown django:django *