2013-02-15 5 views
6

Come programmatore iniziale con +20 ore di codifica in Python e familiarità con i principianti con la riga di comando, ho aperto "Learn SQL The Hard Way" di Zed Shaw e sono stato rapidamente messo a tacere.Impara SQL in modo difficile - Creazione di .sql con .db in SQL Lite 3 - Perché e come?

In exercise 01, Zed ha si crea la tua prima tavola con questo primo comando:

sqlite3 ex1.db < ex1.sql 

Tuttavia questo non riesce a correre nella mia riga di comando, dando il messaggio di errore, "-bash: ex1.sql: Nessun file o directory con questo nome." Inizialmente, ho ignorato questo codice raccomandato e proceduto con:

sqlite3 ex1.db 
SQLite version 3.7.15.1 2012-12-19 20:39:10 
Enter ".help" for instructions 
Enter SQL statements terminated with a ";" 
sqlite> CREATE TABLE person (
    ...>  id INTEGER PRIMARY KEY, 
    ...>  first_name TEXT, 
    ...>  last_name TEXT, 
    ...>  age INTEGER 
    ...>); 

Running "ls -l" nella riga di comando mostra:

-rw-r--r-- 1 thefifth staff 2048 Feb 15 15:23 ex1.db 

Ma quello che voglio e sto riuscendo a ottenere è:

$ ls -l 
-rw-r--r-- 1 zedshaw staff 2048 Nov 8 16:18 ex1.db 
-rw-r--r-- 1 zedshaw staff 92 Nov 8 16:14 ex1.sql 

I Googled intorno e ho trovato this blog che implementa la stessa sintassi "name.db < name.sql", ma seguendo lungo il codice qui non ha funzionato per me. Questo Stack Overflow ha anche una sintassi simile, ma nel contesto della conversione di .sql in sqlite3.

In particolare, mi chiedo se questo è lo "<" per l'utilizzo nel terminale di bash nativo e che non riesco a soddisfare determinati criteri per il suo uso corretto. Inoltre, non conosco lo scopo di creare un file .sql e .db, anche se apparentemente uno è molto più piccolo dell'altro. Forse ho installato sqlite3 in modo errato, ma sembra funzionare bene.

Grazie per il vostro aiuto!

risposta

6
  1. Salvare il codice in un file con estensione sql
  2. Poi nel terminale: sqlite3 ex1.db < ex1.sql per creare un ex1.db
  3. Mettere in ter minal: sqlite3 ex1.db .schema
  4. Oppure inserire: sqlite3 ex1.db [... e poi ....] .schema
+0

Delle due risposte, questa risposta assomigliava più strettamente alla risposta di Zed, sebbene il file 2048 sia stato in qualche modo creato in formato .dv, almeno in un formato di database. Grazie! – surrealdetective

10
sqlite3 ex1.db < ex1.sql 

Per quanto sopra per lavorare, ex1.sql dovrebbe già esistere. < è un carattere utilizzato nelle shell per il reindirizzamento dell'input. sqlite3 viene avviato qui con un database nuovo o esistente (creerà il database in base alle esigenze) e riceverà istruzioni SQL da ex1.sql, eseguendole e modificando di conseguenza ex1.db.

Ora cerchiamo di generare ex1.sql da ex1.db, che a quanto pare si vuole fare:

sqlite3 ex1.db .dump > ex1.sql 

Usiamo nuovo impianto di redirezione della shell, ora reindirizzando l'uscita a ex1.sql. Il comando .dump fa sqlite scrivere istruzioni SQL che ricreeranno database simile quando vengono eseguiti in un database vuoto: le tabelle vengono ricreate e popolate con INSERT, ecc

Ora si può passare al punto 1:

sqlite3 ex1copy.db < ex1.sql 
+0

Grazie per la chiara risposta! Totalmente utile. – surrealdetective

2

Ho incontrato lo stesso problema oggi, e come te mi chiedevo perché il mio comando non funzionasse. Come accennato sopra, l'autore presuppone che tu crei il comando iniziale in un editor di testo e che salvi come un file .sql. Quindi il comando ex1.db < ex1.sql converte il file in un file .db.

Problemi correlati