2010-03-04 10 views
46

मैं है एक फ़ाइल, user.sql में एसक्यूएल निम्नलिखित:SQLite - फ़ाइल से बहु-लाइन SQL स्क्रिप्ट चलाएं?

CREATE TABLE user 
(
    user_id INTEGER PRIMARY KEY, 
    username varchar(255), 
    password varchar(255) 
); 

हालांकि, निम्न आदेश निष्पादित किया जाता है जब:

sqlite3 my.db < user.sql 

निम्न त्रुटि उत्पन्न होता है:

Error: near line 1: near ")": syntax error 

मैं एसक्यूएल को जैसा रखना चाहता हूं, क्योंकि फाइल को स्रोत नियंत्रण में चेक किया जाएगा और अब यह अधिक रखरखाव और पठनीय होगा। क्या एसक्यूएल इस तरह की कई लाइनों को फैला सकता है, या क्या मुझे इसे एक ही पंक्ति में रखना होगा?

+0

को संभालने के लिए उन्नत बनाया है जब आप इसे करने की कोशिश, क्या हुआ? क्या आपने 'sqlite3 mydb.db

+0

आपके द्वारा प्रदान किए गए कोड स्निपेट की तुलना में आपका त्रुटि संदेश बहुत समझ में नहीं आता है। लाइन 1 पर कोई ")" नहीं है। क्या आप 'user.sql' से वास्तविक कोड प्रदान कर सकते हैं? –

+0

कृपया ध्यान दें, कि कुछ डीबी स्क्रिप्ट पसंद नहीं करते हैं जो एक खाली रेखा के बिना (!) समाप्त होते हैं। – KFleischer

उत्तर

24

मुझे बिल्कुल वही समस्या थी।

तब मैंने देखा, मेरे संपादक (नोटपैड ++) लाइनों के अंत के लिए मैकिंतोश प्रारूप की रिपोर्ट करता है।

यूनिक्स शैली में ईल्स को कनवर्ट करने से स्क्रिप्ट फ़ाइल को प्रारूप में बदल दिया गया, जिसे sqlite3 समझा गया।

2

एकाधिक लाइनें कोई समस्या नहीं हैं। एक प्लेटफ़ॉर्म समस्या हो सकती है, क्योंकि मैं ओएस एक्स 10.5.8 पर SQLite3 3.6.22 का उपयोग करके सफलतापूर्वक इस उदाहरण को चलाने में सक्षम हूं।

20

मुझे एहसास है कि यह आपके प्रश्न का सीधा जवाब नहीं है। जैसा कि ब्रायन का उल्लेख है, यह एक मूर्ख मंच मुद्दा हो सकता है।

आप अजगर के माध्यम से SQLite के साथ इंटरफेस, तो आप शायद सबसे प्लेटफ़ॉर्म-विशिष्ट मुद्दों से बचने जाएगा और आप :-)

कुछ इस तरह datetime कॉलम की तरह मजेदार बातें करने के लिए ठीक से कार्य करेंगे मिलती है:

import sqlite3 

qry = open('create_table_user.sql', 'r').read() 
conn = sqlite3.connect('/path/to/db') 
c = conn.cursor() 
c.execute(qry) 
conn.commit() 
c.close() 
conn.close() 
+14

सहायक और संक्षिप्त कोड, @bernie के लिए धन्यवाद। भविष्य में अन्य लोगों के लिए जो इस पर आते हैं: यदि आपके SQL फ़ाइल में एक से अधिक कथन हैं, तो c.execute (qry) –

+0

की बजाय c.executescript (qry) हमें आपकी टिप्पणी, जॉर्डन के लिए धन्यवाद। यह इस धागे के भविष्य के पाठकों के लिए सहायक होने की संभावना है। 'Executescript()' के बारे में एक मामूली नोट जोड़ने के लिए: [यह डीबी-एपीआई का मानक हिस्सा नहीं है] (http://docs.python.org/library/sqlite3.html#sqlite3.Connection.executescript), तो कुछ पायथन-डेटाबेस पुस्तकालय इसे लागू नहीं कर सकते हैं। – bernie

1

यहाँ बर्नी के अजगर उदाहरण लिपि में अपवाद के बजाय चुपचाप नाकाम रहने (विंडोज 7, ActiveState अजगर 3.x)

import sqlite3 
import os 
import os.path 
import ctypes 

databaseFile = '.\\SomeDB.db' 
sqlFile = '.\\SomeScripts.sql' 

# Delete the old table 
if os.path.isfile(databaseFile): 
    os.remove(databaseFile) 

# Create the tables 
qry = open(sqlFile, 'r').read() 
sqlite3.complete_statement(qry) 
conn = sqlite3.connect(databaseFile) 
cursor = conn.cursor() 
try: 
    cursor.executescript(qry) 
except Exception as e: 
    MessageBoxW = ctypes.windll.user32.MessageBoxW 
    errorMessage = databaseFile + ': ' + str(e) 
    MessageBoxW(None, errorMessage, 'Error', 0) 
    cursor.close() 
    raise 
संबंधित मुद्दे