2013-11-01 13 views
5

Tôi đã tạo cơ sở dữ liệu bằng cách sử dụng SQLite3. và phiên bản python của tôi là 2.7.5.Loại nối tiếp SQLite3 không được tăng lên

Trước khi tạo cơ sở dữ liệu tôi chỉ cần tạo cơ sở dữ liệu ví dụ và kiểm tra xem liệu nó có hoạt động tốt hay không. và không thành công khi số id không được tăng lên ngay cả khi tôi tuyên bố đó là loại serial.

Tôi tạo ra cơ sở dữ liệu đơn giản:

import sqlite3 
con = sqlite3.connect('sample.db') 
cur = con.cursor() 
cur.execute("""CREATE TABLE sample(id serial,test real)""") 
cur.execute("""INSERT INTO sample(test) VALUES(?)""",(3,)) 
cur.execute("""INSERT INTO sample(test) VALUES(?)""",(6,)) 
cur.execute("""INSERT INTO sample(test) VALUES(?)""",(8,)) 
con.commit() 

Sau đó, tôi lấy tất cả dữ liệu:

data = cur.execute("""SELECT * from sample""") 
t = data.fetchall() 

In [33]: t 
Out[33]: [(None, 3.0), (None, 6.0), (None, 8.0)] 

tôi mong đợi này: Out[33]: [(1, 3.0), (2, 6.0), (3, 8.0)] Tuy nhiên, Như bạn có thể thấy, tất cả các yếu tố idNone

Làm cách nào để giải quyết vấn đề này? Tôi biết tôi có thể làm bằng cách tăng thêm một biến và Chèn nó. như sau:

id += 1 
cur.execute("""CREATE TABLE sample(id serial,test real)""") 
id += 1 
cur.execute("""INSERT INTO sample(test) VALUES(?)""",(3,)) 
id += 1 
cur.execute("""INSERT INTO sample(test) VALUES(?)""",(6,)) 

Tuy nhiên, không phải là khủng khiếp sao? Tôi không muốn làm điều đó. Tôi muốn làm cho mã của tôi rõ ràng và thông minh.

+2

Bạn lấy loại 'nối tiếp' * ở đâu? Không có từ khóa như vậy trong SQLite. –

+0

Thật sao? Tôi tìm thấy nó trên internet cũng trong SÁCH! hmmm, sau đó có bất kỳ thay thế nào làm những gì tôi muốn? – SamuraiT

Trả lời

6

Không có serial loại dữ liệu trong SQLite. Cách chính xác để tạo bảng là với AUTOINCREMENT trong SQLite:

CREATE TABLE sample (id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, 
         test REAL); 
+0

Cảm ơn bạn rất nhiều nó rất hữu ích! nhưng 'NOT NULL' làm gì? Tôi có thể bỏ qua nó không? hoặc một lỗi sẽ xảy ra? – SamuraiT

+0

NOT NULL chỉ có nghĩa là, trường này là bắt buộc. Và, vâng, bạn có thể bỏ qua nó. –

+0

ok vì vậy tôi hiểu 'NOT NULL' là tùy chọn. – SamuraiT

4

Bạn cần đánh dấu một cột là INTEGER PRIMARY KEY hoặc INTEGER PRIMARY KEY AUTOINCREMENT để nhận hành vi tăng tự động.

Sự khác biệt giữa hai loại đó là tinh tế; biểu mẫu thứ hai sẽ không bao giờ sử dụng lại ID. Xem tài liệu ROWID and the INTEGER PRIMARY KEY.

+0

uh, bây giờ tôi hiểu ý bạn là gì! Cảm ơn bạn! – SamuraiT

+0

Rất vui khi được giúp đỡ! Rất tiếc, bạn chỉ có thể đánh dấu * một * câu trả lời là được chấp nhận, chứ không phải cả hai. :-) –

+0

Lúc đầu, tôi không thể hiểu rõ câu trả lời của bạn, nhưng sau câu trả lời của Mr.Alexander Zhukov và tôi đã cố gắng làm những gì anh ấy nói với tôi. và sau đó cuối cùng, tôi cũng hiểu ý của bạn. vì vậy tôi đã đánh dấu câu trả lời của anh ấy là chấp nhận sin Đó là câu trả lời đầu tiên tôi hiểu. – SamuraiT

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