2015-12-10 11 views
5

श्रेणी से बाहर बाइंड या कॉलम इंडेक्स एक MWE के लिए नीचे मेरा उत्तर देखें!नोड.जेएस और एसक्लाइट, SQLITE_RANGE:

मुझे पता है कि यह मूर्ख बेवकूफ है और उत्तर शायद मेरे सामने सही है, लेकिन मुझे यह नहीं पता कि मुझे यह SQLITE_RANGE त्रुटि क्यों मिलती है, क्योंकि मेरी ऑब्जेक्ट ऐसा लगता है कि इसमें प्रत्येक गुण की आवश्यकता है।

console.log "values " , values 

    # Recording in db 
    console.assert values.login? 
    console.assert values.password_sha?  
    console.assert values.email? 
    console.assert values.token? 
    values.password = null 
    @db.run "INSERT INTO user VALUES (NULL, $login, $password_sha, $email, $token)", values, (err) -> 
     console.error err if err? 

यहाँ अपने सर्वर के उत्पादन

values { login: 'ostream', 
    email: 'ijw', 
    password: 'justine', 
    token: 'acppn99ngiafw29', 
    password_sha: 'b1820c2ec34175954bdaa42038b48886b4c83f8d53f88b5315c415898855e4f8' } 

{ [Error: SQLITE_RANGE: bind or column index out of range] errno: 25, code: 'SQLITE_RANGE' } 

अग्रिम धन्यवाद है!

+0

उपयोगकर्ता (कॉल 1, col2, col3, col4, col5) में कॉलम निर्दिष्ट करने का प्रयास करें VALUES (...) 'जहां' col..' आपका कॉलम नाम है। यदि पहला कॉलम auto_increment इसे छोड़ देता है और NULL – lad2025

+0

FTR सेट नहीं करता है तो मेरी तालिका का .cheche है: 'तालिका उपयोगकर्ता बनाएं (आईडी पूर्णांक प्राथमिक कुंजी, लॉगिन टेक्स्ट, पासवर्ड_शा टेक्स्ट, ईमेल टेक्स्ट, टोकन टेक्स्ट); ' –

+0

lad2025: ऐसा लगता है हाँ काम करता है। मैं मूल्यों को सीधे क्यों नहीं डाल सकता? लगता है कि .schema मैच लगता है। –

उत्तर

-4

मैं एक परीक्षण करने की कोशिश की और मैं एक ही त्रुटि मिलती है:

sqlite3 = require 'sqlite3' 
db = new sqlite3.Database('testfile.db'); 

user = 
    name: 'hello' 
    password: 'jambon' 

db.run 'insert into "user" (name, password) VALUES ($name, $password)', user, (err) -> 
    console.log 'request executed : ', err 

सर्वर जवाब:

request executed : { [Error: SQLITE_RANGE: bind or column index out of range] errno: 25, code: 'SQLITE_RANGE' } 

क्यों?

+0

से नीचे मेरा उत्तर देखें ठीक है, इसे ढूंढें। हालांकि हालांकि $ प्रतीक अनिवार्य था, लेकिन प्लेसहोल्डर सीधे आवेदन करता है। उस के लिए खेद है, दोस्तों। –

2

जब आप INSERT तुम हमेशा स्तंभ सूची का होना चाहिए:

INSERT INTO "user"(login, password_sha, email, token) 
VALUES ('ostream', 
     'b1820c2ec34175954bdaa42038b48886b4c83f8d53f88b5315c415898855e4f8', 
     'ijw', 'acppn99ngiafw29'); 

SELECT * 
FROM "user" 

SqlFiddleDemo

ध्यान रखें कि user कीवर्ड और " के साथ उद्धृत किया जाना चाहिए या आप users करने के लिए तालिका नाम बदल सकते हैं ।

1

जाहिर है कि आपको क्या करना है यह सुनिश्चित करना है कि user ऑब्जेक्ट में कुंजियां $ के साथ प्रीफ़िक्स की गई हैं। अन्यथा sqlite3 उन्हें प्लेसहोल्डर्स के मान के रूप में नहीं पहचाना जाएगा। प्रयास करें:

sqlite3 = require 'sqlite3' 
db = new sqlite3.Database('testfile.db'); 

user = 
    $name: 'hello' 
    $password: 'jambon' 

db.run 'insert into "user" (name, password) VALUES ($name, $password)', user, (err) -> 
    console.log 'request executed : ', err 

यह बहुत अच्छी तरह से प्रलेखित नहीं है, लेकिन the test cases पर ध्यान देकर आप कोई अन्य विकल्प हैं कि देख सकते हैं, उन्हें @ या : साथ लगाकर की तरह। किसी भी मामले में, आपकी ऑब्जेक्ट को उपसर्ग सहित प्लेसहोल्डर्स से मेल खाना पड़ेगा।