Lớp dữ liệu Python sqlite

Sử dụng cơ sở dữ liệu để lưu trữ dữ liệu nghe có vẻ phức tạp hơn nhiều so với thực tế. Trong bài viết này, chúng tôi sẽ đề cập đến cách sử dụng cơ sở dữ liệu để lưu trữ các loại dữ liệu khác nhau. Chúng tôi sẽ nhanh chóng xem xét cách bạn có thể tìm kiếm các tham số cụ thể và cách nhận được chính xác những gì bạn muốn

Trong các bài viết trước, chúng ta đã thấy cách lưu trữ dữ liệu vào các tệp văn bản thuần túy, đây không gì khác hơn là một cách cụ thể để sắp xếp các đối tượng của chúng ta. Trong lần phát hành thứ hai, chúng ta đã thấy cách tuần tự hóa các đối tượng phức tạp bằng cách sử dụng các công cụ tích hợp sẵn của Python để lưu chúng dưới dạng tệp nhị phân. Trong bài viết này, chúng ta sẽ khám phá một mô-đun rất hữu ích khác có tên là SQLite, mô-đun này sẽ cho phép chúng ta lưu trữ dữ liệu trong cơ sở dữ liệu

cơ sở dữ liệu

Rất có thể bạn đã nghe nói về cơ sở dữ liệu trong ngữ cảnh của các trang web. Đó là nơi lưu trữ tên người dùng, email và mật khẩu của bạn. Đó là nơi chính phủ lưu tất cả thông tin họ có về bạn. Tuy nhiên, cơ sở dữ liệu cũng có thể được sử dụng cho các dự án quy mô nhỏ hơn, chẳng hạn như phần mềm điều khiển thiết bị trong phòng thí nghiệm hoặc phân tích dữ liệu

Dạng cơ sở dữ liệu đơn giản nhất có thể được coi là một bảng với các cột và hàng. Nếu bạn đã từng sử dụng một bảng tính, thì nó trông giống hệt như vậy. Khung dữ liệu của Pandas có cùng định dạng. Các bảng có tiêu đề cho mỗi cột và một mục nhập khác nhau trên mỗi hàng. Điều này thực sự buộc bạn phải có hệ thống theo cách bạn lưu trữ thông tin của mình

Tương tác với cơ sở dữ liệu là một chủ đề phức tạp vì nó thường liên quan đến việc học một ngôn ngữ kịch bản mới để lưu trữ và truy xuất thông tin. Trong hướng dẫn này, bạn sẽ học những điều cơ bản của một trong những ngôn ngữ này được gọi là SQL. Chỉ với những điều cơ bản, có rất nhiều thứ bạn có thể đạt được

Một điều quan trọng cần chỉ ra là thông thường bạn cần cài đặt thêm phần mềm để sử dụng cơ sở dữ liệu. Nếu bạn đã từng nghe nói về MySQL hoặc Postgres, bạn có thể biết rằng đó là những thư viện lớn cần có một khóa học toàn bộ về chính họ. Tuy nhiên, Python gói SQLite, một cơ sở dữ liệu tệp đơn, rất đơn giản. Không cần phần mềm bổ sung để chạy các ví dụ ở đây

Tạo bảng

Hãy bắt đầu nhanh chóng với SQLite. Điều đầu tiên bạn cần làm để làm việc với cơ sở dữ liệu là tự tạo cơ sở dữ liệu. Trong trường hợp của SQLite, đây sẽ là một tệp. nó là dễ dàng như thế này

import sqlite3

conn = sqlite3.connect('AA_db.sqlite')
conn.close()

Khi bạn sử dụng

CREATE TABLE experiments (name VARCHAR, description VARCHAR)
5, SQLite sẽ cố mở tệp mà bạn đang chỉ định và nếu nó không tồn tại, nó sẽ tạo một tệp mới. Khi bạn có cơ sở dữ liệu, bạn cần tạo một bảng trong đó. Đây là nơi ngôn ngữ SQL mà tôi đã đề cập trước đây phát huy tác dụng. Giả sử bạn muốn tạo một bảng lưu trữ hai biến, mô tả về thử nghiệm và tên của người thực hiện thử nghiệm. Bạn sẽ làm như sau

import sqlite3

conn = sqlite3.connect('AA_db.sqlite')
cur = conn.cursor()
cur.execute('CREATE TABLE experiments (name VARCHAR, description VARCHAR)')
conn.commit()

conn.close()

Sau khi mở (hoặc tạo) cơ sở dữ liệu, chúng ta phải tạo một con trỏ. Con trỏ sẽ cho phép bạn thực thi mã SQL. Để tạo một bảng, chúng ta cần sử dụng lệnh sau

CREATE TABLE experiments (name VARCHAR, description VARCHAR)

Nó khá mô tả. bạn đang tạo một bảng có tên là thử nghiệm với hai cột.

CREATE TABLE experiments (name VARCHAR, description VARCHAR)
6 và
CREATE TABLE experiments (name VARCHAR, description VARCHAR)
7. Mỗi một trong những cột đó sẽ thuộc loại
CREATE TABLE experiments (name VARCHAR, description VARCHAR)
8. Đừng lo lắng quá nhiều về nó ngay bây giờ. Lệnh
CREATE TABLE experiments (name VARCHAR, description VARCHAR)
9 lưu các thay đổi vào cơ sở dữ liệu và sau đó bạn đóng kết nối. Xin chúc mừng, bạn đã tạo bảng đầu tiên của mình

Vấn đề hiện tại là không có phản hồi về những gì bạn đã làm. Ví dụ: nếu bạn đang sử dụng PyCharm, thì nó đi kèm với triển khai SQLite tích hợp. Do đó, bạn có thể chỉ cần nhấp vào tệp và bạn sẽ có thể điều hướng qua nội dung của cơ sở dữ liệu. Bạn cũng có thể thử một ứng dụng như trình duyệt SQLite để trực quan hóa các tệp. Ngoài ra còn có một Tiện ích bổ sung của Firefox

lưu ý Phần mở rộng. sqlite không bắt buộc. Nếu bạn sử dụng nó, nhiều chương trình cấp cao hơn sẽ xác định nó là cơ sở dữ liệu và có thể mở nó bằng một cú nhấp đúp. Bạn cũng có thể sử dụng. db, phổ biến hơn nếu làm theo hướng dẫn Flask hoặc Django

Thêm dữ liệu vào cơ sở dữ liệu

Bây giờ bạn đã có một cơ sở dữ liệu, đã đến lúc lưu trữ một số dữ liệu vào đó. Tất cả các ví dụ luôn bắt đầu bằng cách tạo một kết nối và một con trỏ, từ giờ trở đi chúng ta sẽ bỏ qua phần này, nhưng bạn nên đưa vào mã của mình. Thêm thông tin vào cơ sở dữ liệu cũng liên quan đến việc sử dụng SQL. Bạn sẽ cần phải làm như sau

________số 8_______

Bạn có thể chạy lệnh này bao nhiêu lần tùy ý và nếu bạn đang kiểm tra cơ sở dữ liệu của mình bằng một công cụ bên ngoài, bạn sẽ thấy rằng bạn tiếp tục thêm hàng vào bảng. Như bạn thấy ở trên, mã SQL có thể phát sinh vấn đề nếu bạn đang sử dụng các biến thay vì văn bản thuần túy

Hãy tưởng tượng rằng bạn cố gắng lưu một chuỗi bao gồm ký tự

cur.execute('INSERT INTO experiments (name, description) values ("Aquiles", "My experiment description")')
conn.commit()
0. SQL sẽ nghĩ rằng
cur.execute('INSERT INTO experiments (name, description) values ("Aquiles", "My experiment description")')
conn.commit()
0 từ biến của bạn thực sự đang đóng đối số và nó sẽ báo lỗi. Tệ hơn nữa, nếu đó là một biến do người khác gửi, điều này có thể dẫn đến một thứ gọi là SQL injection. Theo cách tương tự, trong đó Pickle có thể được sử dụng để chạy mã tùy ý, SQL có thể bị lừa để thực hiện các thao tác không mong muốn. Chẳng mấy chốc bạn sẽ có thể hiểu được trò đùa SQL injection của XKCD

Một cách thích hợp để thêm các giá trị mới vào một bảng là

cur.execute('INSERT INTO experiments (name, description) VALUES (?, ?)',
            ('Another User', 'Another Experiment, even using " other characters"'))
conn.commit()

Giả sử rằng quyền truy cập vào cơ sở dữ liệu chỉ là của bạn, tôi. e. bạn sẽ không lấy các biến từ công chúng, bạn không nên lo lắng quá nhiều về sự an toàn. Trong mọi trường hợp, điều quan trọng là phải nhận thức được

Truy xuất dữ liệu

Bây giờ bạn đã có một số dữ liệu được lưu trữ trong cơ sở dữ liệu, chúng tôi cần truy xuất dữ liệu đó. Bạn có thể làm như sau

cur.execute('SELECT * FROM experiments')
data = cur.fetchall()

Dòng đầu tiên yêu cầu tất cả các cột từ thử nghiệm. Đó là ý nghĩa của

cur.execute('INSERT INTO experiments (name, description) values ("Aquiles", "My experiment description")')
conn.commit()
2. Dòng thứ hai thực sự nhận được các giá trị. Chúng tôi đã sử dụng
cur.execute('INSERT INTO experiments (name, description) values ("Aquiles", "My experiment description")')
conn.commit()
3, nhưng bạn cũng có thể sử dụng
cur.execute('INSERT INTO experiments (name, description) values ("Aquiles", "My experiment description")')
conn.commit()
4 để lấy chỉ một phần tử

Cho đến nay, không có gì đặc biệt. Hãy tưởng tượng rằng bạn chỉ muốn nhận các mục có liên quan đến một người dùng cụ thể. Bạn có thể làm như sau

cur.execute('SELECT * FROM experiments WHERE name="Aquiles"')
data_3 = cur.fetchall()

lưu ý SQL không phân biệt chữ hoa chữ thường đối với các lệnh của nó. CHỌN hoặc chọn hoặc Chọn có nghĩa giống nhau. Tuy nhiên, nếu bạn thay Aquiles cho aquiles, kết quả sẽ khác

Tất nhiên, cũng có thể xảy ra trường hợp không có mục nhập nào phù hợp với tiêu chí của bạn và do đó, kết quả sẽ là một danh sách trống. Một lần nữa, hãy nhớ rằng những gì chúng ta đang tìm kiếm,

cur.execute('INSERT INTO experiments (name, description) values ("Aquiles", "My experiment description")')
conn.commit()
5 có thể là một biến, và một lần nữa bạn có thể gặp lỗi SQL nếu bạn có các ký tự đặc biệt

Tại thời điểm này, có hai mối quan tâm có thể xuất hiện trong đầu bạn. Một mặt, không có cách nào để tham khảo các mục cụ thể trong cơ sở dữ liệu. Hai bài viết khác nhau, cùng một nội dung thì không thể phân biệt được với nhau

Khác là nhiều hơn một yêu cầu tính năng. Hãy tưởng tượng rằng bạn muốn lưu trữ thêm thông tin về người dùng, không chỉ tên. Sẽ không hợp lý khi thêm các cột bổ sung vào cơ sở dữ liệu thử nghiệm vì chúng tôi sẽ sao chép rất nhiều thông tin. Lý tưởng nhất là chúng tôi sẽ bắt đầu một bảng mới, chỉ để đăng ký người dùng và thông tin của họ

Thêm khóa chính

Nếu bạn đã từng xem bất kỳ chương trình bảng tính nào hoặc thậm chí là Khung dữ liệu Pandas, bạn có thể nhận thấy rằng mỗi hàng được xác định bằng một số. Điều này rất tiện lợi vì khi bạn biết rằng thông tin quan trọng nằm ở dòng N, bạn chỉ cần nhớ số đó và truy xuất dữ liệu một cách cụ thể

Bảng mà chúng tôi đã tạo không bao gồm cách đánh số này, còn được gọi là khóa chính. Thêm một cột mới thường không phải là vấn đề, nhưng vì chúng tôi đang xử lý khóa chính, SQLite không cho phép chúng tôi thực hiện điều đó trong một bước. Chúng ta nên tạo một bảng mới, sao chép nội dung của bảng cũ, v.v. Vì chúng tôi chỉ có dữ liệu về đồ chơi nên chúng tôi có thể bắt đầu lại từ đầu

Đầu tiên, chúng tôi sẽ xóa bảng khỏi cơ sở dữ liệu, làm mất tất cả nội dung của nó. Sau đó, chúng tôi sẽ tạo một bảng mới, với khóa chính của nó và chúng tôi sẽ thêm một số nội dung vào đó. Chúng ta có thể làm mọi thứ với một lệnh SQL rất dài thay vì chạy nhiều

cur.execute('INSERT INTO experiments (name, description) values ("Aquiles", "My experiment description")')
conn.commit()
6. Đối với điều đó, chúng tôi sử dụng ký hiệu trích dẫn ba lần của Python

sql_command = """
DROP TABLE IF EXISTS experiments;
CREATE TABLE experiments (
    id INTEGER,
    name VARCHAR,
    description VARCHAR,
    PRIMARY KEY (id));
INSERT INTO experiments (name, description) values ("Aquiles", "My experiment description");
INSERT INTO experiments (name, description) values ("Aquiles 2", "My experiment description 2");
"""
cur.executescript(sql_command)
conn.commit()

Phần quan trọng ở đây là lệnh SQL. Đầu tiên, chúng tôi loại bỏ bảng nếu nó tồn tại, điều đó có nghĩa là chúng tôi sẽ xóa nó và mất tất cả nội dung của nó. Sau đó, chúng tôi tạo lại bảng thử nghiệm, nhưng lần này chúng tôi thêm một cột mới có tên là

cur.execute('INSERT INTO experiments (name, description) values ("Aquiles", "My experiment description")')
conn.commit()
7, thuộc loại số nguyên. Ở cuối câu lệnh, chúng tôi xác định
cur.execute('INSERT INTO experiments (name, description) values ("Aquiles", "My experiment description")')
conn.commit()
7 là khóa chính. Sau đó, chúng tôi thêm hai mục vào bảng để làm ví dụ

Nếu bạn chạy lại mã truy xuất, bạn sẽ nhận thấy rằng mỗi phần tử có một số duy nhất xác định nó. Nếu chúng tôi muốn tìm nạp cái đầu tiên (hoặc cái thứ hai, v.v. ), chúng ta chỉ cần làm như sau

cur.execute('SELECT * FROM experiments WHERE id=1')
data = cur.fetchone()

Lưu ý rằng chúng tôi đang sử dụng

cur.execute('INSERT INTO experiments (name, description) values ("Aquiles", "My experiment description")')
conn.commit()
9 thay vì
cur.execute('INSERT INTO experiments (name, description) VALUES (?, ?)',
            ('Another User', 'Another Experiment, even using " other characters"'))
conn.commit()
0 vì chúng tôi biết rằng đầu ra chỉ nên là một phần tử. Kiểm tra sự khác biệt nếu bạn sử dụng một hoặc lệnh khác trong dữ liệu mà bạn nhận được từ cơ sở dữ liệu

Việc thêm khóa chính là điều cơ bản để giảm thời gian tìm nạp dữ liệu mà bạn đang tìm kiếm. Không chỉ vì nó cho phép bạn tham khảo các mục nhập cụ thể mà còn vì cách cơ sở dữ liệu hoạt động, việc giải quyết dữ liệu theo khóa của chúng nhanh hơn nhiều

Giá trị mặc định cho các trường

Cho đến nay chúng tôi chỉ sử dụng hai loại biến.

CREATE TABLE experiments (name VARCHAR, description VARCHAR)
8 và
cur.execute('INSERT INTO experiments (name, description) VALUES (?, ?)',
            ('Another User', 'Another Experiment, even using " other characters"'))
conn.commit()
2. Varchar đã được sử dụng cho tên của người thực hiện thí nghiệm và mô tả của nó, trong khi số nguyên chỉ được sử dụng cho số
cur.execute('INSERT INTO experiments (name, description) values ("Aquiles", "My experiment description")')
conn.commit()
7. Tuy nhiên, chúng ta có thể phát triển các bảng phức tạp hơn nhiều. Ví dụ: chúng ta có thể chỉ định không chỉ loại mà còn giới hạn độ dài. Chúng ta cũng có thể chỉ định các giá trị mặc định, đơn giản hóa các thao tác khi lưu trữ các mục mới vào bảng. Một trong những lợi thế của việc này là dữ liệu của chúng tôi sẽ rất nhất quán

Hãy tưởng tượng rằng bạn cũng muốn lưu trữ ngày chạy thử nghiệm, bạn có thể thêm một trường bổ sung và mỗi khi bạn tạo một thử nghiệm mới, bạn cũng thêm một trường có ngày hoặc bạn hướng dẫn cơ sở dữ liệu tự động thêm ngày. Tại thời điểm tạo bảng, bạn nên làm như sau

DROP TABLE IF EXISTS experiments;
CREATE TABLE experiments (
    id INTEGER,
    name VARCHAR,
    description VARCHAR,
    perfomed_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY (id));
INSERT INTO experiments (name, description) values ("Aquiles", "My experiment description");
INSERT INTO experiments (name, description) values ("Aquiles 2", "My experiment description 2");

Lưu ý trường mới có tên là

cur.execute('INSERT INTO experiments (name, description) VALUES (?, ?)',
            ('Another User', 'Another Experiment, even using " other characters"'))
conn.commit()
4, sử dụng loại
cur.execute('INSERT INTO experiments (name, description) VALUES (?, ?)',
            ('Another User', 'Another Experiment, even using " other characters"'))
conn.commit()
5 và cũng chỉ định giá trị
cur.execute('INSERT INTO experiments (name, description) VALUES (?, ?)',
            ('Another User', 'Another Experiment, even using " other characters"'))
conn.commit()
6. Nếu bạn kiểm tra hai thử nghiệm đã chèn (bạn có thể sử dụng mã của ví dụ trước), bạn sẽ thấy có một trường mới với ngày và giờ hiện tại. Bạn cũng có thể thêm các giá trị mặc định cho các trường khác, chẳng hạn

import sqlite3

conn = sqlite3.connect('AA_db.sqlite')
cur = conn.cursor()
cur.execute('CREATE TABLE experiments (name VARCHAR, description VARCHAR)')
conn.commit()

conn.close()
0

Lần tới khi bạn thêm thử nghiệm mới, nếu bạn không chỉ định người dùng đã thực hiện thử nghiệm đó, thử nghiệm sẽ mặc định là

cur.execute('INSERT INTO experiments (name, description) values ("Aquiles", "My experiment description")')
conn.commit()
5 (tên tôi). Chỉ định giá trị mặc định là một cách rất hữu ích để tránh thiếu thông tin. Ví dụ:
cur.execute('INSERT INTO experiments (name, description) VALUES (?, ?)',
            ('Another User', 'Another Experiment, even using " other characters"'))
conn.commit()
4 sẽ luôn được thêm vào. Điều này đảm bảo rằng ngay cả khi ai đó quên tuyên bố rõ ràng thời gian của một thử nghiệm, thì ít nhất một giả định rất hợp lý đã được đưa ra

Các kiểu dữ liệu SQLite

SQLite khác với các trình quản lý cơ sở dữ liệu khác, chẳng hạn như MySQL hoặc Postgres vì ​​tính linh hoạt của nó đối với các loại dữ liệu và độ dài. SQLite chỉ định nghĩa 4 loại trường

  • VÔ GIÁ TRỊ. Giá trị là giá trị NULL
  • số nguyên. Giá trị là một số nguyên đã ký, được lưu trữ trong 1, 2, 3, 4, 6 hoặc 8 byte tùy thuộc vào độ lớn của giá trị
  • CÓ THẬT. Giá trị là một giá trị dấu phẩy động, được lưu trữ dưới dạng số dấu phẩy động IEEE 8 byte
  • CHỮ. Giá trị là một chuỗi văn bản, được lưu trữ bằng mã hóa cơ sở dữ liệu (UTF-8, UTF-16BE hoặc UTF-16LE)
  • BÃI. Giá trị là một đốm dữ liệu, được lưu trữ chính xác như khi nhập

Và sau đó, nó xác định một thứ gọi là mối quan hệ, chỉ định loại dữ liệu ưa thích sẽ được lưu trữ trong một cột. Điều này rất hữu ích để duy trì khả năng tương thích với các nguồn cơ sở dữ liệu khác và có thể gây ra một số vấn đề đau đầu nếu bạn đang làm theo hướng dẫn được thiết kế cho các loại cơ sở dữ liệu khác. Loại chúng tôi đã sử dụng,

CREATE TABLE experiments (name VARCHAR, description VARCHAR)
8 không phải là một trong những kiểu dữ liệu được chỉ định, nhưng nó được hỗ trợ thông qua các mối quan hệ. Nó sẽ được coi là trường
cur.execute('SELECT * FROM experiments')
data = cur.fetchall()
0

Cách SQLite quản lý các loại dữ liệu, nếu bạn chưa quen với cơ sở dữ liệu, không quan trọng. Nếu bạn chưa quen với cơ sở dữ liệu, bạn chắc chắn nên xem tài liệu chính thức để hiểu sự khác biệt và tận dụng tốt nhất các khả năng

Cơ sở dữ liệu quan hệ

Có lẽ bạn đã nghe nói về cơ sở dữ liệu quan hệ. Cho đến nay, theo cách chúng tôi đã sử dụng SQLite, thật khó để thấy những lợi thế so với các tệp CSV đơn giản, chẳng hạn. Nếu bạn chỉ đang lưu trữ một bảng, thì bạn hoàn toàn có thể làm điều tương tự với bảng tính hoặc Khung dữ liệu Pandas. Sức mạnh của cơ sở dữ liệu đáng chú ý hơn nhiều khi bạn bắt đầu tạo mối quan hệ giữa các trường

Trong các ví dụ mà chúng ta đã thảo luận trước đó, bạn đã thấy rằng khi chạy thử nghiệm, bạn muốn lưu trữ ai là người dùng thực hiện phép đo. Số lượng người dùng rất có thể sẽ bị hạn chế và có lẽ bạn muốn theo dõi một số thông tin, chẳng hạn như tên, email và số điện thoại

Cách tổ chức tất cả thông tin này là tạo một bảng trong đó bạn lưu trữ người dùng. Mỗi mục nhập sẽ có một khóa chính. Từ bảng các thí nghiệm, thay vì lưu tên người dùng, bạn lưu khóa của người dùng. Ngoài ra, bạn có thể chỉ định rằng, khi tạo thử nghiệm mới, người dùng được liên kết với thử nghiệm đã tồn tại. Tất cả điều này đạt được thông qua việc sử dụng khóa ngoại, như thế này

import sqlite3

conn = sqlite3.connect('AA_db.sqlite')
cur = conn.cursor()
cur.execute('CREATE TABLE experiments (name VARCHAR, description VARCHAR)')
conn.commit()

conn.close()
1

cảnh báo tùy thuộc vào cài đặt SQLite của bạn, bạn có thể cần thêm hỗ trợ cho các khóa ngoại. Chạy lệnh sau khi tạo cơ sở dữ liệu để chắc chắn.

cur.execute('SELECT * FROM experiments')
data = cur.fetchall()
1

Trước tiên, bạn cần tạo một người dùng mới, ví dụ

import sqlite3

conn = sqlite3.connect('AA_db.sqlite')
cur = conn.cursor()
cur.execute('CREATE TABLE experiments (name VARCHAR, description VARCHAR)')
conn.commit()

conn.close()
2

Và sau đó bạn có thể tạo một thử nghiệm mới

import sqlite3

conn = sqlite3.connect('AA_db.sqlite')
cur = conn.cursor()
cur.execute('CREATE TABLE experiments (name VARCHAR, description VARCHAR)')
conn.commit()

conn.close()
3

Lưu ý rằng nếu bạn cố thêm thử nghiệm với user_id không tồn tại, bạn sẽ gặp lỗi

import sqlite3

conn = sqlite3.connect('AA_db.sqlite')
cur = conn.cursor()
cur.execute('CREATE TABLE experiments (name VARCHAR, description VARCHAR)')
conn.commit()

conn.close()
4

Khi bạn chạy đoạn mã trên bằng Python, bạn sẽ nhận được thông báo sau

import sqlite3

conn = sqlite3.connect('AA_db.sqlite')
cur = conn.cursor()
cur.execute('CREATE TABLE experiments (name VARCHAR, description VARCHAR)')
conn.commit()

conn.close()
5

Đó là chính xác những gì chúng tôi đã mong đợi. Tuy nhiên, hãy lưu ý rằng nếu bạn bỏ đi phần

cur.execute('SELECT * FROM experiments')
data = cur.fetchall()
2, tôi. e. , nếu bạn không chỉ định giá trị, giá trị này sẽ mặc định là
cur.execute('SELECT * FROM experiments')
data = cur.fetchall()
3, giá trị này hợp lệ (thử nghiệm không có người dùng). Nếu bạn muốn ngăn chặn hành vi này, bạn sẽ cần chỉ định nó một cách rõ ràng

import sqlite3

conn = sqlite3.connect('AA_db.sqlite')
cur = conn.cursor()
cur.execute('CREATE TABLE experiments (name VARCHAR, description VARCHAR)')
conn.commit()

conn.close()
6

Bây giờ chúng tôi đã xác định rằng

cur.execute('SELECT * FROM experiments')
data = cur.fetchall()
2 là
cur.execute('SELECT * FROM experiments')
data = cur.fetchall()
5. Nếu chúng ta cố chạy đoạn mã sau

import sqlite3

conn = sqlite3.connect('AA_db.sqlite')
cur = conn.cursor()
cur.execute('CREATE TABLE experiments (name VARCHAR, description VARCHAR)')
conn.commit()

conn.close()
7

Nó sẽ báo lỗi sau

import sqlite3

conn = sqlite3.connect('AA_db.sqlite')
cur = conn.cursor()
cur.execute('CREATE TABLE experiments (name VARCHAR, description VARCHAR)')
conn.commit()

conn.close()
8

Lưu trữ mảng Numpy vào cơ sở dữ liệu

Lưu trữ dữ liệu phức tạp vào cơ sở dữ liệu không phải là một nhiệm vụ tầm thường. Cơ sở dữ liệu chỉ xác định một số kiểu dữ liệu và các mảng có nhiều mảng không nằm giữa chúng. Điều này có nghĩa là chúng ta phải chuyển đổi các mảng thành thứ có thể được lưu trữ trong cơ sở dữ liệu. Vì SQLite chỉ chỉ định 4 loại dữ liệu chính, nên chúng ta nên chọn một trong số chúng. Trong bài viết trước chúng ta đã thảo luận rất nhiều về tuần tự hóa. Những ý tưởng tương tự có thể được sử dụng để lưu trữ một mảng trong cơ sở dữ liệu

Ví dụ: bạn có thể sử dụng Pickle để chuyển đổi dữ liệu của mình thành byte và lưu trữ chúng bằng cách sử dụng base64 làm trường

cur.execute('SELECT * FROM experiments')
data = cur.fetchall()
0. Bạn cũng có thể lưu trực tiếp đối tượng Pickle vào một trường
cur.execute('SELECT * FROM experiments')
data = cur.fetchall()
7. Bạn có thể chuyển đổi mảng của mình thành một danh sách và phân tách các giá trị của nó bằng
cur.execute('SELECT * FROM experiments')
data = cur.fetchall()
8 hoặc sử dụng một ký hiệu cụ thể để phân tách các hàng và cột, v.v. Tuy nhiên, SQLite cũng cung cấp khả năng đăng ký các loại dữ liệu mới. Như đã giải thích trong câu trả lời này trên Stack Overflow, chúng tôi cần tạo bộ điều hợp và bộ chuyển đổi

import sqlite3

conn = sqlite3.connect('AA_db.sqlite')
cur = conn.cursor()
cur.execute('CREATE TABLE experiments (name VARCHAR, description VARCHAR)')
conn.commit()

conn.close()
9

Những gì chúng tôi đang làm trong đoạn mã trên là cho SQLite biết phải làm gì khi một trường loại

cur.execute('SELECT * FROM experiments')
data = cur.fetchall()
9 được khai báo. Khi chúng tôi đang lưu trữ trường, nó sẽ được chuyển đổi thành byte, có thể được lưu trữ dưới dạng BLOB trong cơ sở dữ liệu. Khi truy xuất dữ liệu, chúng ta sẽ đọc các byte và chuyển đổi chúng thành một mảng có nhiều mảng. Lưu ý rằng điều này là có thể bởi vì các phương thức
cur.execute('SELECT * FROM experiments WHERE name="Aquiles"')
data_3 = cur.fetchall()
0 và
cur.execute('SELECT * FROM experiments WHERE name="Aquiles"')
data_3 = cur.fetchall()
1 biết cách xử lý các byte khi lưu/tải

Điều quan trọng cần lưu ý là không cần thiết phải đăng ký cả bộ điều hợp và bộ chuyển đổi. Cái đầu tiên chịu trách nhiệm chuyển đổi một kiểu dữ liệu cụ thể thành một đối tượng tương thích với SQLite. Bạn có thể làm điều này để tự động tuần tự hóa các lớp của riêng mình, v.v. Trình chuyển đổi chịu trách nhiệm chuyển đổi lại thành đối tượng của bạn. Bạn có thể chơi xung quanh và xem điều gì sẽ xảy ra khi bạn không đăng ký một trong hai

Khi bạn xác định bảng của mình, bạn có thể sử dụng kiểu dữ liệu 'mảng' mới tạo của mình

CREATE TABLE experiments (name VARCHAR, description VARCHAR)
0

Điều quan trọng cần lưu ý là để đoạn mã trên hoạt động khi bạn bắt đầu kết nối với cơ sở dữ liệu, bạn nên thêm đoạn mã sau

CREATE TABLE experiments (name VARCHAR, description VARCHAR)
1

Tùy chọn

cur.execute('SELECT * FROM experiments WHERE name="Aquiles"')
data_3 = cur.fetchall()
2 yêu cầu SQLite sử dụng bộ điều hợp và bộ chuyển đổi đã đăng ký. Nếu bạn không bao gồm tùy chọn đó, nó sẽ không sử dụng những gì bạn đã đăng ký và sẽ mặc định là các loại dữ liệu tiêu chuẩn

Để lưu trữ mảng, bạn có thể làm như sau

CREATE TABLE experiments (name VARCHAR, description VARCHAR)
2

Điều này sẽ chuyển đổi mảng của bạn thành byte và nó sẽ lưu trữ nó trong cơ sở dữ liệu. Khi bạn đọc lại, nó sẽ biến Byte trở lại thành một mảng

Điều bạn phải ghi nhớ là khi bạn lưu trữ các mảng có nhiều mảng (hoặc bất kỳ đối tượng không chuẩn nào) vào cơ sở dữ liệu, bạn sẽ mất đi những lợi thế nội tại của cơ sở dữ liệu, tôi. e. khả năng hoạt động trên các phần tử. Điều tôi muốn nói là với SQL, rất dễ dàng thay thế một trường trong tất cả các mục phù hợp với một tiêu chí, chẳng hạn, nhưng bạn sẽ không thể làm điều đó đối với một mảng có nhiều mảng, ít nhất là với các lệnh SQL

kết hợp thông tin

Cho đến nay, chúng ta đã thấy cách tạo một số bảng có giá trị và cách liên kết chúng thông qua việc sử dụng khóa chính và khóa ngoại. Tuy nhiên, SQL còn mạnh hơn thế rất nhiều, đặc biệt là khi truy xuất thông tin. Một trong những điều bạn có thể làm là nối thông tin từ các bảng khác nhau thành một bảng duy nhất. Hãy nhanh chóng xem những gì có thể được thực hiện. Đầu tiên, chúng ta sẽ tạo lại các bảng với các thử nghiệm và người dùng, như chúng ta đã thấy trước đây. Bạn có thể check code tại đây. Bạn nên có hai mục cho người dùng và hai mục cho thử nghiệm

Bạn có thể chạy đoạn mã sau

CREATE TABLE experiments (name VARCHAR, description VARCHAR)
3

Những gì bạn sẽ thấy được in ra là id của người dùng, tên và mô tả về thử nghiệm. Điều này tiện lợi hơn nhiều so với việc chỉ nhìn thấy id của người dùng vì bạn sẽ thấy ngay thông tin mà mình cần. Hơn nữa, bạn có thể lọc kết quả dựa trên thuộc tính của một trong hai bảng. Hãy tưởng tượng bạn muốn nhận các thử nghiệm được thực hiện bởi

cur.execute('SELECT * FROM experiments WHERE name="Aquiles"')
data_3 = cur.fetchall()
3, nhưng bạn không biết id người dùng của nó. Bạn có thể thay đổi lệnh trên thành như sau

CREATE TABLE experiments (name VARCHAR, description VARCHAR)
4

Và bạn sẽ thấy rằng chỉ có dữ liệu liên quan đến người dùng đó được truy xuất

Các câu lệnh tham gia rất phức tạp và rất linh hoạt. Bạn có thể nhận thấy rằng chúng tôi đã sử dụng tùy chọn

cur.execute('SELECT * FROM experiments WHERE name="Aquiles"')
data_3 = cur.fetchall()
4, nhưng đó không phải là khả năng duy nhất. Ví dụ: nếu bạn muốn kết hợp các bảng không liên quan thông qua khóa ngoại, bạn muốn kết hợp dữ liệu từ các nguồn khác nhau thuộc cùng một ngày, bạn có thể sử dụng các kiểu kết hợp khác. Sơ đồ trong trang web này rất rõ ràng, nhưng đi sâu vào các chi tiết vượt quá khả năng của một hướng dẫn giới thiệu

Cách sử dụng cơ sở dữ liệu trong các dự án khoa học

Việc tận dụng sức mạnh của cơ sở dữ liệu không rõ ràng đối với các nhà phát triển lần đầu, đặc biệt nếu bạn không thuộc lĩnh vực phát triển web. Một trong những ưu điểm chính của cơ sở dữ liệu là bạn không cần phải ghi nhớ toàn bộ cấu trúc. Ví dụ: Hãy tưởng tượng rằng bạn sẽ có một dự án rất lớn, với hàng triệu phép đo của hàng nghìn thử nghiệm với hàng trăm người dùng. Nhiều khả năng bạn không thể tải tất cả thông tin như trong các biến bộ nhớ

Bằng cách sử dụng cơ sở dữ liệu, bạn sẽ có thể lọc các phép đo được thực hiện bởi một người dùng cụ thể trong một khung thời gian nhất định hoặc phù hợp với một mô tả cụ thể mà không thực sự tải mọi thứ vào bộ nhớ. Ngay cả khi đơn giản, ví dụ này đã cho bạn thấy một trường hợp sử dụng rất rõ ràng trong đó Khung dữ liệu hoặc mảng có nhiều mảng sẽ không thành công

Cơ sở dữ liệu được sử dụng trong nhiều dự án khoa học quy mô lớn, chẳng hạn như quan sát thiên văn, mô phỏng, v.v. Bằng cách sử dụng cơ sở dữ liệu, các nhóm khác nhau có thể cấp cho người dùng quyền truy cập vào các khả năng lọc và kết hợp, lấy dữ liệu mong muốn chứ không phải toàn bộ bộ sưu tập. Tất nhiên, đối với các nhóm nhỏ, nó có thể giống như một sự vượt quá. Nhưng hãy tưởng tượng rằng bạn có thể lọc qua dữ liệu của mình, được thu thập trong nhiều năm, để tìm một phép đo cụ thể

kết luận

Một trong những thách thức chính của việc sử dụng cơ sở dữ liệu là chúng yêu cầu học một ngôn ngữ mới gọi là SQL. Trong bài viết này, chúng tôi đã cố gắng chỉ ra những khái niệm cơ bản nhất, cho phép mọi người bắt đầu và xây dựng con đường của mình thông qua các tìm kiếm thông minh của Google

Python có hỗ trợ tích hợp cho SQLite, một cơ sở dữ liệu dựa trên tệp rất lý tưởng để bắt đầu. Không cần thiết lập thêm nữa, mọi thứ đều hoạt động tốt và nhiều hướng dẫn có thể tìm thấy trực tuyến liên quan đến SQL cũng sẽ hoạt động với SQLite

Việc sử dụng cơ sở dữ liệu cho các dự án chỉ thực hiện một lần có thể là quá mức cần thiết, nhưng đối với các chương trình chạy lâu dài, chẳng hạn như phần mềm để kiểm soát các thiết lập hoặc phân tích dữ liệu tùy chỉnh, nó có thể mở ra cơ hội cho các giải pháp rất sáng tạo. Việc kết hợp cơ sở dữ liệu cho siêu dữ liệu và tệp cho dữ liệu có thêm lợi thế về tính di động cao (chia sẻ dữ liệu chỉ là chia sẻ một tệp) và một cách dễ dàng để tìm kiếm thông qua bộ sưu tập siêu dữ liệu được lưu trữ trên cơ sở dữ liệu

Làm cách nào để lưu trữ dữ liệu từ Python sang SQLite?

SQLite Python. Chèn dữ liệu .
Đầu tiên, kết nối với cơ sở dữ liệu SQLite bằng cách tạo một đối tượng Kết nối
Thứ hai, tạo một đối tượng Con trỏ bằng cách gọi phương thức con trỏ của đối tượng Kết nối
Thứ ba, thực hiện một câu lệnh INSERT

Làm cách nào để truy cập cơ sở dữ liệu SQLite bằng Python?

Python và SQL .
nhập sqlite3 # Tạo kết nối SQL tới cơ sở dữ liệu SQLite của chúng tôi con = sqlite3. .
nhập sqlite3 # Tạo kết nối SQL tới cơ sở dữ liệu SQLite của chúng tôi con = sqlite3. .
nhập gấu trúc dưới dạng pd nhập sqlite3 # Đọc kết quả truy vấn sqlite vào DataFrame của gấu trúc con = sqlite3

Làm cách nào để lưu trữ đối tượng lớp trong cơ sở dữ liệu Python?

Bạn không thể lưu trữ đối tượng trong DB. Những gì bạn làm là lưu trữ dữ liệu từ đối tượng và xây dựng lại nó sau. Một cách hay là sử dụng thư viện SQLAlchemy xuất sắc. Nó cho phép bạn ánh xạ lớp đã xác định của mình tới một bảng trong cơ sở dữ liệu

Làm cách nào để viết truy vấn SQLite bằng Python?

Ví dụ về Python để chèn một hàng vào bảng SQLite .
Kết nối với SQLite từ Python. .
Xác định truy vấn Chèn SQL. .
Nhận đối tượng con trỏ từ kết nối. .
Thực hiện truy vấn chèn bằng phương thức exec(). .
Cam kết thay đổi của bạn. .
Nhận số hàng bị ảnh hưởng. .
Xác minh kết quả bằng truy vấn SQL SELECT