2013-02-15 24 views
6

Là một lập trình viên bắt đầu với +20 giờ mã hóa Python và quen thuộc với người mới bằng dòng lệnh, tôi đã mở ra "Tìm hiểu về SQL theo cách cứng" của Zed Shaw và nhanh chóng bị bối rối.Tìm hiểu SQL Cách cứng - Tạo .sql với .db trong SQL Lite 3 - Tại sao và như thế nào?

Trong exercise 01, Zed có bạn tạo bảng đầu tiên của bạn với lệnh đầu tiên này:

sqlite3 ex1.db < ex1.sql 

Tuy nhiên điều này không chạy trong dòng lệnh của tôi, đưa ra các thông báo lỗi, "-bash: ex1.sql: Không có tập tin hoặc thư mục." Ban đầu, tôi bỏ qua này đang khuyến khích và tiến hành với:

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 
    ...>); 

Chạy "ls -l" trong dòng lệnh cho thấy:

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

Nhưng những gì tôi muốn và đang thất bại trong việc nhận được là:

$ 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 

tôi đã google xung quanh và tìm thấy this blog mà thực hiện cùng một cú pháp "name.db < name.sql", nhưng sau cùng mã ở đây không làm việc cho tôi cả. Stack Overflow này cũng có cú pháp tương tự, nhưng trong ngữ cảnh chuyển đổi .sql thành sqlite3.

Cụ thể, tôi tự hỏi nếu đây là "<" để sử dụng trong thiết bị đầu cuối bash gốc và tôi không đáp ứng các tiêu chí nhất định để sử dụng chính xác. Ngoài ra, tôi không biết mục đích của việc tạo cả tệp .sql và .db, mặc dù dường như một tệp nhỏ hơn nhiều so với tệp kia. Có lẽ tôi đã cài đặt sqlite3 không chính xác, nhưng nó có vẻ là làm việc tốt.

Cảm ơn sự giúp đỡ của bạn!

Trả lời

6
  1. Lưu mã của bạn trong một tập tin với phần mở rộng sql
  2. Sau đó, trong thiết bị đầu cuối: sqlite3 ex1.db < ex1.sql cho tạo ra một ex1.db
  3. Đặt trong ter minal: sqlite3 ex1.db .schema
  4. Hoặc đặt: sqlite3 ex1.db [... và sau đó ....] .schema
+0

Trong hai câu trả lời, câu trả lời này gần giống với câu trả lời của Zed, mặc dù tệp 2048 được tạo bằng cách nào đó dưới định dạng .dv, ít nhất nó ở định dạng cơ sở dữ liệu. Cảm ơn! – surrealdetective

10
sqlite3 ex1.db < ex1.sql 

Để làm việc ở trên, ex1.sql đã tồn tại. < là một ký tự được sử dụng trong các trình bao để chuyển hướng đầu vào. sqlite3 được bắt đầu ở đây với cơ sở dữ liệu mới hoặc hiện có (nó sẽ tạo cơ sở dữ liệu khi cần) và nhận các câu lệnh SQL từ ex1.sql, thực thi chúng và sửa đổi ex1.db cho phù hợp.

Giờ đây chúng ta hãy tạo ex1.sql từ ex1.db, mà bạn có vẻ muốn làm:

sqlite3 ex1.db .dump > ex1.sql 

Chúng tôi sử dụng cơ sở chuyển hướng lại vỏ, bây giờ chuyển hướng đầu ra để ex1.sql. Lệnh .dump làm sqlite viết ra câu lệnh SQL mà sẽ tái tạo cơ sở dữ liệu tương tự như khi chúng được thực hiện trong một cơ sở dữ liệu rỗng: bảng được tái tạo và dân cư với INSERT vv

Bây giờ bạn có thể đi đến bước 1:

sqlite3 ex1copy.db < ex1.sql 
+0

Cảm ơn bạn đã phản hồi rõ ràng! Hoàn toàn hữu ích. – surrealdetective

2

Tôi đã gặp phải vấn đề tương tự hôm nay, và như bạn đã tự hỏi tại sao lệnh của tôi không hoạt động. Như đã đề cập ở trên tác giả giả định rằng bạn tạo lệnh ban đầu trong một trình soạn thảo văn bản và lưu dưới dạng tệp .sql. Và sau đó ex1.db < lệnh ex1.sql chuyển đổi tệp thành tệp .db.

Các vấn đề liên quan