Làm thế nào để bạn truy vấn dữ liệu trong python?

Để kết thúc, chúng ta hãy xem cách truy cập cơ sở dữ liệu từ ngôn ngữ lập trình đa năng như Python. Các ngôn ngữ khác sử dụng gần như chính xác cùng một mô hình. tên thư viện và chức năng có thể khác nhau, nhưng các khái niệm là như nhau

Đây là một chương trình Python ngắn chọn vĩ độ và kinh độ từ cơ sở dữ liệu SQLite được lưu trữ trong một tệp có tên

[-49.85, -128.57]
[-47.15, -126.72]
[-48.87, -123.4]
7

import sqlite3

connection = sqlite3.connect["survey.db"]
cursor = connection.cursor[]
cursor.execute["SELECT Site.lat, Site.long FROM Site;"]
results = cursor.fetchall[]
for r in results:
    print[r]
cursor.close[]
connection.close[]

[-49.85, -128.57]
[-47.15, -126.72]
[-48.87, -123.4]

Chương trình bắt đầu bằng cách nhập thư viện

[-49.85, -128.57]
[-47.15, -126.72]
[-48.87, -123.4]
8. Nếu chúng tôi đang kết nối với MySQL, DB2 hoặc một số cơ sở dữ liệu khác, chúng tôi sẽ nhập một thư viện khác, nhưng tất cả chúng đều cung cấp các chức năng giống nhau, do đó phần còn lại của chương trình của chúng tôi không phải thay đổi [ít nhất là không nhiều] nếu

Dòng 2 thiết lập kết nối đến cơ sở dữ liệu. Vì chúng tôi đang sử dụng SQLite, tất cả những gì chúng tôi cần chỉ định là tên của tệp cơ sở dữ liệu. Các hệ thống khác cũng có thể yêu cầu chúng tôi cung cấp tên người dùng và mật khẩu. Dòng 3 sau đó sử dụng kết nối này để tạo một. Giống như con trỏ trong trình soạn thảo, vai trò của nó là theo dõi xem chúng ta đang ở đâu trong cơ sở dữ liệu

Trên dòng 4, chúng tôi sử dụng con trỏ đó để yêu cầu cơ sở dữ liệu thực hiện truy vấn cho chúng tôi. Truy vấn được viết bằng SQL và được chuyển tới

[-49.85, -128.57]
[-47.15, -126.72]
[-48.87, -123.4]
9 dưới dạng một chuỗi. Công việc của chúng tôi là đảm bảo rằng SQL được định dạng đúng;

Cơ sở dữ liệu trả về kết quả của truy vấn cho chúng tôi để đáp lại lệnh gọi

import sqlite3

def get_name[database_file, person_id]:
    query = "SELECT personal || ' ' || family FROM Person WHERE id='" + person_id + "';"

    connection = sqlite3.connect[database_file]
    cursor = connection.cursor[]
    cursor.execute[query]
    results = cursor.fetchall[]
    cursor.close[]
    connection.close[]

    return results[0][0]

print["Full name for dyer:", get_name['survey.db', 'dyer']]
0 trên dòng 5. Kết quả này là một danh sách có một mục cho mỗi bản ghi trong tập hợp kết quả;

Cuối cùng, các dòng 8 và 9 đóng con trỏ và kết nối của chúng ta, vì cơ sở dữ liệu chỉ có thể giữ một số lượng hạn chế những thứ này mở cùng một lúc. Tuy nhiên, vì việc thiết lập kết nối cần có thời gian nên chúng ta không nên mở kết nối, thực hiện một thao tác, sau đó đóng kết nối, chỉ để mở lại vài micro giây sau đó để thực hiện thao tác khác. Thay vào đó, việc tạo một kết nối luôn mở trong suốt thời gian tồn tại của chương trình là điều bình thường

Các truy vấn trong các ứng dụng thực thường sẽ phụ thuộc vào các giá trị do người dùng cung cấp. Ví dụ: hàm này lấy ID của người dùng làm tham số và trả về tên của họ

import sqlite3

def get_name[database_file, person_id]:
    query = "SELECT personal || ' ' || family FROM Person WHERE id='" + person_id + "';"

    connection = sqlite3.connect[database_file]
    cursor = connection.cursor[]
    cursor.execute[query]
    results = cursor.fetchall[]
    cursor.close[]
    connection.close[]

    return results[0][0]

print["Full name for dyer:", get_name['survey.db', 'dyer']]

Full name for dyer: William Dyer

Chúng tôi sử dụng phép nối chuỗi trên dòng đầu tiên của chức năng này để tạo truy vấn chứa ID người dùng mà chúng tôi đã được cung cấp. Điều này có vẻ đủ đơn giản, nhưng điều gì sẽ xảy ra nếu ai đó đưa cho chúng ta chuỗi này làm đầu vào?

________số 8

Có vẻ như có rác sau ID người dùng, nhưng đó là rác được lựa chọn rất cẩn thận. Nếu chúng tôi chèn chuỗi này vào truy vấn của mình, kết quả là

SELECT personal || ' ' || family FROM Person WHERE id='dyer'; DROP TABLE Survey; SELECT '';

Nếu chúng tôi thực hiện điều này, nó sẽ xóa một trong các bảng trong cơ sở dữ liệu của chúng tôi

Đây được gọi là , và nó đã được sử dụng để tấn công hàng nghìn chương trình trong nhiều năm. Đặc biệt, nhiều trang web lấy dữ liệu từ người dùng chèn trực tiếp giá trị vào truy vấn mà không kiểm tra kỹ trước.

Vì một kẻ xấu có thể cố gắng đưa lệnh vào các truy vấn của chúng ta theo nhiều cách khác nhau, nên cách an toàn nhất để đối phó với mối đe dọa này là thay thế các ký tự như dấu ngoặc kép bằng các ký tự thoát tương đương của chúng, để chúng ta có thể đặt bất kỳ thứ gì mà người dùng đưa cho chúng ta vào trong một chuỗi một cách an toàn. Chúng ta có thể làm điều này bằng cách sử dụng a thay vì định dạng câu lệnh của mình dưới dạng chuỗi. Đây là chương trình ví dụ của chúng tôi trông như thế nào nếu chúng tôi làm điều này

import sqlite3

connection = sqlite3.connect["survey.db"]
cursor = connection.cursor[]
cursor.execute["SELECT Site.lat, Site.long FROM Site;"]
results = cursor.fetchall[]
for r in results:
    print[r]
cursor.close[]
connection.close[]
0

Full name for dyer: William Dyer

Các thay đổi chính nằm trong chuỗi truy vấn và lệnh gọi

import sqlite3

def get_name[database_file, person_id]:
    query = "SELECT personal || ' ' || family FROM Person WHERE id='" + person_id + "';"

    connection = sqlite3.connect[database_file]
    cursor = connection.cursor[]
    cursor.execute[query]
    results = cursor.fetchall[]
    cursor.close[]
    connection.close[]

    return results[0][0]

print["Full name for dyer:", get_name['survey.db', 'dyer']]
1. Thay vì tự định dạng truy vấn, chúng tôi đặt dấu chấm hỏi trong mẫu truy vấn nơi chúng tôi muốn chèn giá trị. Khi chúng tôi gọi
import sqlite3

def get_name[database_file, person_id]:
    query = "SELECT personal || ' ' || family FROM Person WHERE id='" + person_id + "';"

    connection = sqlite3.connect[database_file]
    cursor = connection.cursor[]
    cursor.execute[query]
    results = cursor.fetchall[]
    cursor.close[]
    connection.close[]

    return results[0][0]

print["Full name for dyer:", get_name['survey.db', 'dyer']]
1, chúng tôi cung cấp một danh sách chứa nhiều giá trị bằng số dấu chấm hỏi trong truy vấn. Thư viện khớp các giá trị với các dấu chấm hỏi theo thứ tự và dịch bất kỳ ký tự đặc biệt nào trong các giá trị thành các ký tự thoát tương đương để chúng an toàn khi sử dụng

Chúng tôi cũng có thể sử dụng con trỏ của

[-49.85, -128.57]
[-47.15, -126.72]
[-48.87, -123.4]
8 để thay đổi cơ sở dữ liệu của mình, chẳng hạn như chèn tên mới. Chẳng hạn, chúng ta có thể định nghĩa một hàm mới có tên là
import sqlite3

def get_name[database_file, person_id]:
    query = "SELECT personal || ' ' || family FROM Person WHERE id='" + person_id + "';"

    connection = sqlite3.connect[database_file]
    cursor = connection.cursor[]
    cursor.execute[query]
    results = cursor.fetchall[]
    cursor.close[]
    connection.close[]

    return results[0][0]

print["Full name for dyer:", get_name['survey.db', 'dyer']]
4 như vậy

import sqlite3

connection = sqlite3.connect["survey.db"]
cursor = connection.cursor[]
cursor.execute["SELECT Site.lat, Site.long FROM Site;"]
results = cursor.fetchall[]
for r in results:
    print[r]
cursor.close[]
connection.close[]
6

import sqlite3

connection = sqlite3.connect["survey.db"]
cursor = connection.cursor[]
cursor.execute["SELECT Site.lat, Site.long FROM Site;"]
results = cursor.fetchall[]
for r in results:
    print[r]
cursor.close[]
connection.close[]
7

Lưu ý rằng trong các phiên bản của sqlite3 >= 2. 5, hàm

import sqlite3

def get_name[database_file, person_id]:
    query = "SELECT personal || ' ' || family FROM Person WHERE id='" + person_id + "';"

    connection = sqlite3.connect[database_file]
    cursor = connection.cursor[]
    cursor.execute[query]
    results = cursor.fetchall[]
    cursor.close[]
    connection.close[]

    return results[0][0]

print["Full name for dyer:", get_name['survey.db', 'dyer']]
5 được mô tả ở trên sẽ không thành công với
import sqlite3

def get_name[database_file, person_id]:
    query = "SELECT personal || ' ' || family FROM Person WHERE id='" + person_id + "';"

    connection = sqlite3.connect[database_file]
    cursor = connection.cursor[]
    cursor.execute[query]
    results = cursor.fetchall[]
    cursor.close[]
    connection.close[]

    return results[0][0]

print["Full name for dyer:", get_name['survey.db', 'dyer']]
6, mặc dù chúng tôi đã thêm mục nhập của Mary vào bảng bằng cách sử dụng
import sqlite3

def get_name[database_file, person_id]:
    query = "SELECT personal || ' ' || family FROM Person WHERE id='" + person_id + "';"

    connection = sqlite3.connect[database_file]
    cursor = connection.cursor[]
    cursor.execute[query]
    results = cursor.fetchall[]
    cursor.close[]
    connection.close[]

    return results[0][0]

print["Full name for dyer:", get_name['survey.db', 'dyer']]
4. Điều này là do chúng tôi phải thực hiện
import sqlite3

def get_name[database_file, person_id]:
    query = "SELECT personal || ' ' || family FROM Person WHERE id='" + person_id + "';"

    connection = sqlite3.connect[database_file]
    cursor = connection.cursor[]
    cursor.execute[query]
    results = cursor.fetchall[]
    cursor.close[]
    connection.close[]

    return results[0][0]

print["Full name for dyer:", get_name['survey.db', 'dyer']]
8 trước khi đóng kết nối, để lưu các thay đổi của chúng tôi vào cơ sở dữ liệu

[-49.85, -128.57]
[-47.15, -126.72]
[-48.87, -123.4]
0

[-49.85, -128.57]
[-47.15, -126.72]
[-48.87, -123.4]
1

Điền vào một bảng so với. Giá trị in

Viết chương trình Python tạo cơ sở dữ liệu mới trong một tệp có tên

import sqlite3

def get_name[database_file, person_id]:
    query = "SELECT personal || ' ' || family FROM Person WHERE id='" + person_id + "';"

    connection = sqlite3.connect[database_file]
    cursor = connection.cursor[]
    cursor.execute[query]
    results = cursor.fetchall[]
    cursor.close[]
    connection.close[]

    return results[0][0]

print["Full name for dyer:", get_name['survey.db', 'dyer']]
9 chứa một bảng duy nhất có tên là
Full name for dyer: William Dyer
0, với một trường duy nhất có tên là
Full name for dyer: William Dyer
1 và chèn 100.000 số ngẫu nhiên vào giữa 10. 0 và 25. 0. Mất bao lâu để chạy chương trình này?

Dung dịch

[-49.85, -128.57]
[-47.15, -126.72]
[-48.87, -123.4]
2

Để so sánh, chương trình sau ghi các số ngẫu nhiên vào tệp

Full name for dyer: William Dyer
2

[-49.85, -128.57]
[-47.15, -126.72]
[-48.87, -123.4]
3

Lọc trong SQL so với. Lọc trong Python

Viết chương trình Python tạo cơ sở dữ liệu mới tên là

Full name for dyer: William Dyer
3 có cùng cấu trúc với
import sqlite3

def get_name[database_file, person_id]:
    query = "SELECT personal || ' ' || family FROM Person WHERE id='" + person_id + "';"

    connection = sqlite3.connect[database_file]
    cursor = connection.cursor[]
    cursor.execute[query]
    results = cursor.fetchall[]
    cursor.close[]
    connection.close[]

    return results[0][0]

print["Full name for dyer:", get_name['survey.db', 'dyer']]
9 và sao chép tất cả các giá trị lớn hơn 20. 0 từ
import sqlite3

def get_name[database_file, person_id]:
    query = "SELECT personal || ' ' || family FROM Person WHERE id='" + person_id + "';"

    connection = sqlite3.connect[database_file]
    cursor = connection.cursor[]
    cursor.execute[query]
    results = cursor.fetchall[]
    cursor.close[]
    connection.close[]

    return results[0][0]

print["Full name for dyer:", get_name['survey.db', 'dyer']]
9 đến
Full name for dyer: William Dyer
3. cái nào nhanh hơn. lọc các giá trị trong truy vấn hay đọc mọi thứ vào bộ nhớ và lọc bằng Python?

Dung dịch

Ví dụ đầu tiên đọc tất cả dữ liệu vào bộ nhớ và lọc các số bằng câu lệnh if trong Python

[-49.85, -128.57]
[-47.15, -126.72]
[-48.87, -123.4]
4

Ngược lại, ví dụ sau sử dụng câu lệnh điều kiện

Full name for dyer: William Dyer
7 để lọc các số trong SQL. Các dòng duy nhất thay đổi là ở dòng 5, nơi các giá trị được lấy từ
import sqlite3

def get_name[database_file, person_id]:
    query = "SELECT personal || ' ' || family FROM Person WHERE id='" + person_id + "';"

    connection = sqlite3.connect[database_file]
    cursor = connection.cursor[]
    cursor.execute[query]
    results = cursor.fetchall[]
    cursor.close[]
    connection.close[]

    return results[0][0]

print["Full name for dyer:", get_name['survey.db', 'dyer']]
9 và vòng lặp for bắt đầu từ dòng 15 được sử dụng để chèn các số vào
Full name for dyer: William Dyer
3. Lưu ý rằng phiên bản này không yêu cầu sử dụng câu lệnh if của Python

[-49.85, -128.57]
[-47.15, -126.72]
[-48.87, -123.4]
5

Tạo câu lệnh chèn

Một trong những đồng nghiệp của chúng tôi đã gửi cho chúng tôi một tệp chứa các chỉ số nhiệt độ của Robert Olmstead, được định dạng như thế này

[-49.85, -128.57]
[-47.15, -126.72]
[-48.87, -123.4]
6

Viết một chương trình Python nhỏ để đọc tệp này và CHÈN các bản ghi này vào cơ sở dữ liệu khảo sát. Ghi chú. bạn sẽ cần thêm một mục cho Olmstead vào bảng

dyer'; DROP TABLE Survey; SELECT '
0. Nếu bạn đang kiểm tra chương trình của mình nhiều lần, bạn có thể muốn điều tra lệnh
dyer'; DROP TABLE Survey; SELECT '
1 của SQL

Truy vấn trong Python là gì?

Phương thức query[] cho phép bạn truy vấn DataFrame . Phương thức query[] lấy biểu thức truy vấn làm tham số chuỗi, biểu thức này phải đánh giá là Đúng hoặc Sai. Nó trả về DataFrame trong đó kết quả là True theo biểu thức truy vấn.

Làm cách nào để lưu trữ kết quả truy vấn trong biến trong Python?

fetchall[] truy xuất TẤT CẢ kết quả từ truy vấn của bạn, chúng tôi sẽ đặt chúng vào một biến có tên là rows. Sau đó, chúng tôi tạo một trình vòng lặp [điều bạn đã cố gắng thực hiện với vòng lặp while] bằng cách thực hiện cho hàng trong hàng. Sau đó, chúng tôi chỉ cần in từng hàng

Chủ Đề