Hướng dẫn how do you pass a variable to a query in python? - làm thế nào để bạn chuyển một biến vào một truy vấn trong python?

Nhiều cách. Đừng sử dụng cái rõ ràng nhất (

# Multiple values single statement/execution
c.execute('SELECT * FROM stocks WHERE symbol=? OR symbol=?', ('RHAT', 'MSO'))
print c.fetchall()
c.execute('SELECT * FROM stocks WHERE symbol IN (?, ?)', ('RHAT', 'MSO'))
print c.fetchall()
# This also works, though ones above are better as a habit as it's inline with syntax of executemany().. but your choice.
c.execute('SELECT * FROM stocks WHERE symbol=? OR symbol=?', 'RHAT', 'MSO')
print c.fetchall()
# Insert a single item
c.execute('INSERT INTO stocks VALUES (?,?,?,?,?)', ('2006-03-28', 'BUY', 'IBM', 1000, 45.00))
5 với
# Multiple values single statement/execution
c.execute('SELECT * FROM stocks WHERE symbol=? OR symbol=?', ('RHAT', 'MSO'))
print c.fetchall()
c.execute('SELECT * FROM stocks WHERE symbol IN (?, ?)', ('RHAT', 'MSO'))
print c.fetchall()
# This also works, though ones above are better as a habit as it's inline with syntax of executemany().. but your choice.
c.execute('SELECT * FROM stocks WHERE symbol=? OR symbol=?', 'RHAT', 'MSO')
print c.fetchall()
# Insert a single item
c.execute('INSERT INTO stocks VALUES (?,?,?,?,?)', ('2006-03-28', 'BUY', 'IBM', 1000, 45.00))
6) trong mã thực, nó mở ra cho các cuộc tấn công.DON'T use the most obvious one (
# Multiple values single statement/execution
c.execute('SELECT * FROM stocks WHERE symbol=? OR symbol=?', ('RHAT', 'MSO'))
print c.fetchall()
c.execute('SELECT * FROM stocks WHERE symbol IN (?, ?)', ('RHAT', 'MSO'))
print c.fetchall()
# This also works, though ones above are better as a habit as it's inline with syntax of executemany().. but your choice.
c.execute('SELECT * FROM stocks WHERE symbol=? OR symbol=?', 'RHAT', 'MSO')
print c.fetchall()
# Insert a single item
c.execute('INSERT INTO stocks VALUES (?,?,?,?,?)', ('2006-03-28', 'BUY', 'IBM', 1000, 45.00))
5 with
# Multiple values single statement/execution
c.execute('SELECT * FROM stocks WHERE symbol=? OR symbol=?', ('RHAT', 'MSO'))
print c.fetchall()
c.execute('SELECT * FROM stocks WHERE symbol IN (?, ?)', ('RHAT', 'MSO'))
print c.fetchall()
# This also works, though ones above are better as a habit as it's inline with syntax of executemany().. but your choice.
c.execute('SELECT * FROM stocks WHERE symbol=? OR symbol=?', 'RHAT', 'MSO')
print c.fetchall()
# Insert a single item
c.execute('INSERT INTO stocks VALUES (?,?,?,?,?)', ('2006-03-28', 'BUY', 'IBM', 1000, 45.00))
6) in real code, it's open to attacks.

Ở đây sao chép-paste'd từ pydoc của sqlite3:from pydoc of sqlite3:

# Never do this -- insecure!
symbol = 'RHAT'
cur.execute("SELECT * FROM stocks WHERE symbol = '%s'" % symbol)

# Do this instead
t = ('RHAT',)
cur.execute('SELECT * FROM stocks WHERE symbol=?', t)
print(cur.fetchone())

# Larger example that inserts many records at a time
purchases = [('2006-03-28', 'BUY', 'IBM', 1000, 45.00),
             ('2006-04-05', 'BUY', 'MSFT', 1000, 72.00),
             ('2006-04-06', 'SELL', 'IBM', 500, 53.00),
            ]
cur.executemany('INSERT INTO stocks VALUES (?,?,?,?,?)', purchases)

Nhiều ví dụ hơn nếu bạn cần:

# Multiple values single statement/execution
c.execute('SELECT * FROM stocks WHERE symbol=? OR symbol=?', ('RHAT', 'MSO'))
print c.fetchall()
c.execute('SELECT * FROM stocks WHERE symbol IN (?, ?)', ('RHAT', 'MSO'))
print c.fetchall()
# This also works, though ones above are better as a habit as it's inline with syntax of executemany().. but your choice.
c.execute('SELECT * FROM stocks WHERE symbol=? OR symbol=?', 'RHAT', 'MSO')
print c.fetchall()
# Insert a single item
c.execute('INSERT INTO stocks VALUES (?,?,?,?,?)', ('2006-03-28', 'BUY', 'IBM', 1000, 45.00))

Bạn có thể sử dụng Python để truy vấn dữ liệu không?

SELECT some, fields FROM some_table WHERE id = ...

Dữ liệu truy vấn có nghĩa là yêu cầu dữ liệu cụ thể từ bộ dữ liệu. Nếu bạn quen thuộc với SQL, bạn phải biết ý nghĩa của dữ liệu, nhưng nếu bạn sử dụng thư viện Pandas trong Python, bạn vẫn có thể truy vấn dữ liệu từ bộ dữ liệu của mình.

Việc sử dụng %% trong SQL là gì?

Dấu phần trăm (%) đại diện cho số 0, một hoặc nhiều ký tự. Dấu gạch dưới (_) đại diện cho một, ký tự đơn.

cur.execute("""
    INSERT INTO some_table (id, created_at, last_name)
    VALUES (%s, %s, %s);
    """,
    (10, datetime.date(2020, 11, 18), "O'Reilly"))

Truy vấn biến là gì?

INSERT INTO some_table (id, created_at, last_name)
VALUES (10, '2020-11-18', 'O''Reilly');

Trong định nghĩa của một truy vấn mới (xem định nghĩa về truy vấn), bạn có thể xác định các biến truy vấn. Các biến là người giữ chỗ trong các tiêu chí lựa chọn của truy vấn. Trong quá trình xử lý truy vấn, hệ thống thay thế các biến bằng các giá trị cụ thể mà bạn đã nhập thủ công hoặc hệ thống đã tự động xác định.Server-side binding for details.

Các đối số được đặt tên cũng được hỗ trợ bằng cách sử dụng các trình giữ chỗ

SELECT some, fields FROM some_table WHERE id = ...
1 trong truy vấn và chỉ định các giá trị thành ánh xạ. Sử dụng các đối số có tên cho phép chỉ định các giá trị theo bất kỳ thứ tự nào và lặp lại cùng một giá trị ở một số nơi trong truy vấn:

cur.execute("""
    INSERT INTO some_table (id, created_at, updated_at, last_name)
    VALUES (%(id)s, %(created)s, %(created)s, %(name)s);
    """,
    {'id': 10, 'name': "O'Reilly", 'created': datetime.date(2020, 11, 18)})

Sử dụng các ký tự

SELECT some, fields FROM some_table WHERE id = ...
2,
SELECT some, fields FROM some_table WHERE id = ...
3,
SELECT some, fields FROM some_table WHERE id = ...
4 trong tên đối số không được hỗ trợ.

Khi các tham số được sử dụng, để bao gồm một

SELECT some, fields FROM some_table WHERE id = ...
2 theo nghĩa đen trong truy vấn, bạn có thể sử dụng chuỗi
SELECT some, fields FROM some_table WHERE id = ...
6:

cur.execute("SELECT (%s % 2) = 0 AS even", (10,))       # WRONG
cur.execute("SELECT (%s %% 2) = 0 AS even", (10,))      # correct

Mặc dù cơ chế giống như thao tác chuỗi python thông thường, có một vài sự khác biệt tinh tế mà bạn nên quan tâm khi chuyển các tham số cho một truy vấn.

  • Không được sử dụng toán tử chuỗi Python

    SELECT some, fields FROM some_table WHERE id = ...
    
    2: Phương thức
    # Multiple values single statement/execution
    c.execute('SELECT * FROM stocks WHERE symbol=? OR symbol=?', ('RHAT', 'MSO'))
    print c.fetchall()
    c.execute('SELECT * FROM stocks WHERE symbol IN (?, ?)', ('RHAT', 'MSO'))
    print c.fetchall()
    # This also works, though ones above are better as a habit as it's inline with syntax of executemany().. but your choice.
    c.execute('SELECT * FROM stocks WHERE symbol=? OR symbol=?', 'RHAT', 'MSO')
    print c.fetchall()
    # Insert a single item
    c.execute('INSERT INTO stocks VALUES (?,?,?,?,?)', ('2006-03-28', 'BUY', 'IBM', 1000, 45.00))
    
    8 chấp nhận một tuple hoặc từ điển của các giá trị làm tham số thứ hai. Không bao giờ sử dụng
    SELECT some, fields FROM some_table WHERE id = ...
    
    2 hoặc
    cur.execute("""
        INSERT INTO some_table (id, created_at, last_name)
        VALUES (%s, %s, %s);
        """,
        (10, datetime.date(2020, 11, 18), "O'Reilly"))
    
    0 để hợp nhất các giá trị thành các truy vấn:Never use
    SELECT some, fields FROM some_table WHERE id = ...
    
    2 or
    cur.execute("""
        INSERT INTO some_table (id, created_at, last_name)
        VALUES (%s, %s, %s);
        """,
        (10, datetime.date(2020, 11, 18), "O'Reilly"))
    
    0 to merge values into queries:

    cur.execute("INSERT INTO numbers VALUES (%s, %s)" % (10, 20)) # WRONG
    cur.execute("INSERT INTO numbers VALUES (%s, %s)", (10, 20))  # correct
    

  • Đối với các biến vị trí ràng buộc, đối số thứ hai phải luôn luôn là một chuỗi, ngay cả khi nó chứa một biến duy nhất (hãy nhớ rằng Python yêu cầu dấu phẩy để tạo một bộ phần tử duy nhất):

    cur.execute("INSERT INTO foo VALUES (%s)", "bar")    # WRONG
    cur.execute("INSERT INTO foo VALUES (%s)", ("bar"))  # WRONG
    cur.execute("INSERT INTO foo VALUES (%s)", ("bar",)) # correct
    cur.execute("INSERT INTO foo VALUES (%s)", ["bar"])  # correct
    

  • Người giữ chỗ không được trích dẫn:

    cur.execute("INSERT INTO numbers VALUES ('%s')", ("Hello",)) # WRONG
    cur.execute("INSERT INTO numbers VALUES (%s)", ("Hello",))   # correct
    

  • Các chất giữ chỗ của các biến phải luôn là

    SELECT some, fields FROM some_table WHERE id = ...
    
    0, ngay cả khi một trình giữ chỗ khác (chẳng hạn như
    cur.execute("""
        INSERT INTO some_table (id, created_at, last_name)
        VALUES (%s, %s, %s);
        """,
        (10, datetime.date(2020, 11, 18), "O'Reilly"))
    
    2 cho số nguyên hoặc
    cur.execute("""
        INSERT INTO some_table (id, created_at, last_name)
        VALUES (%s, %s, %s);
        """,
        (10, datetime.date(2020, 11, 18), "O'Reilly"))
    
    3 cho phao) có thể trông phù hợp hơn với loại. Bạn có thể tìm thấy những người giữ chỗ khác được sử dụng trong các truy vấn PSYCOPG (
    cur.execute("""
        INSERT INTO some_table (id, created_at, last_name)
        VALUES (%s, %s, %s);
        """,
        (10, datetime.date(2020, 11, 18), "O'Reilly"))
    
    4 và
    cur.execute("""
        INSERT INTO some_table (id, created_at, last_name)
        VALUES (%s, %s, %s);
        """,
        (10, datetime.date(2020, 11, 18), "O'Reilly"))
    
    5) nhưng chúng không liên quan đến loại đối số: xem các tham số và kết quả nhị phân nếu bạn muốn đọc thêm:Binary parameters and results if you want to read more:

    # Multiple values single statement/execution
    c.execute('SELECT * FROM stocks WHERE symbol=? OR symbol=?', ('RHAT', 'MSO'))
    print c.fetchall()
    c.execute('SELECT * FROM stocks WHERE symbol IN (?, ?)', ('RHAT', 'MSO'))
    print c.fetchall()
    # This also works, though ones above are better as a habit as it's inline with syntax of executemany().. but your choice.
    c.execute('SELECT * FROM stocks WHERE symbol=? OR symbol=?', 'RHAT', 'MSO')
    print c.fetchall()
    # Insert a single item
    c.execute('INSERT INTO stocks VALUES (?,?,?,?,?)', ('2006-03-28', 'BUY', 'IBM', 1000, 45.00))
    
    0

  • Chỉ các giá trị truy vấn nên được ràng buộc thông qua phương thức này: nó không nên được sử dụng để hợp nhất các tên trường hoặc trường vào truy vấn. Nếu bạn cần tạo các truy vấn SQL một cách linh hoạt (ví dụ như chọn tên bảng trong thời gian chạy), bạn có thể sử dụng các chức năng được cung cấp trong mô -đun

    cur.execute("""
        INSERT INTO some_table (id, created_at, last_name)
        VALUES (%s, %s, %s);
        """,
        (10, datetime.date(2020, 11, 18), "O'Reilly"))
    
    6:

    # Multiple values single statement/execution
    c.execute('SELECT * FROM stocks WHERE symbol=? OR symbol=?', ('RHAT', 'MSO'))
    print c.fetchall()
    c.execute('SELECT * FROM stocks WHERE symbol IN (?, ?)', ('RHAT', 'MSO'))
    print c.fetchall()
    # This also works, though ones above are better as a habit as it's inline with syntax of executemany().. but your choice.
    c.execute('SELECT * FROM stocks WHERE symbol=? OR symbol=?', 'RHAT', 'MSO')
    print c.fetchall()
    # Insert a single item
    c.execute('INSERT INTO stocks VALUES (?,?,?,?,?)', ('2006-03-28', 'BUY', 'IBM', 1000, 45.00))
    
    1

Nguy hiểm: SQL Injection#

Biểu diễn SQL của nhiều loại dữ liệu thường khác với biểu diễn chuỗi python của chúng. Ví dụ điển hình là với các trích dẫn đơn trong chuỗi: Trong các trích dẫn đơn SQL được sử dụng làm trình phân cách theo nghĩa đen, do đó, các trích dẫn xuất hiện bên trong chuỗi phải được thoát ra, trong khi trong các trích dẫn đơn Python có thể được để lại .

Do sự khác biệt, đôi khi tinh tế, giữa các biểu diễn các loại dữ liệu, cách tiếp cận ngây thơ đối với thành phần chuỗi truy vấn, chẳng hạn như sử dụng kết nối chuỗi Python, là một công thức cho các vấn đề khủng khiếp:

# Multiple values single statement/execution
c.execute('SELECT * FROM stocks WHERE symbol=? OR symbol=?', ('RHAT', 'MSO'))
print c.fetchall()
c.execute('SELECT * FROM stocks WHERE symbol IN (?, ?)', ('RHAT', 'MSO'))
print c.fetchall()
# This also works, though ones above are better as a habit as it's inline with syntax of executemany().. but your choice.
c.execute('SELECT * FROM stocks WHERE symbol=? OR symbol=?', 'RHAT', 'MSO')
print c.fetchall()
# Insert a single item
c.execute('INSERT INTO stocks VALUES (?,?,?,?,?)', ('2006-03-28', 'BUY', 'IBM', 1000, 45.00))
2

Nếu các biến chứa dữ liệu để gửi đến cơ sở dữ liệu đến từ một nguồn không đáng tin cơ sở dữ liệu. Hình thức tấn công này được gọi là tiêm SQL và được biết đến là một trong những hình thức tấn công phổ biến nhất trên các hệ thống cơ sở dữ liệu. Trước khi tiếp tục, xin vui lòng in trang này dưới dạng bản ghi nhớ và treo nó lên bàn của bạn.

PSYCOPG có thể tự động chuyển đổi các đối tượng Python thành các giá trị SQL: Sử dụng tính năng này, mã của bạn sẽ mạnh mẽ và đáng tin cậy hơn. Chúng ta phải nhấn mạnh điểm này:automatically convert Python objects to SQL values: using this feature your code will be more robust and reliable. We must stress this point:

Cảnh báo

  • Don lồng hợp nhất các giá trị hợp nhất cho một truy vấn: tin tặc từ nước ngoài sẽ đột nhập vào máy tính của bạn và đánh cắp không chỉ các đĩa của bạn, mà cả đĩa CD của bạn, chỉ khiến bạn có ba hồ sơ đáng xấu hổ nhất mà bạn từng mua. Trên băng cassette.

  • Nếu bạn sử dụng nhà điều hành

    SELECT some, fields FROM some_table WHERE id = ...
    
    2 để hợp nhất các giá trị cho một truy vấn, Con nghệ sĩ sẽ quyến rũ mèo của bạn, người sẽ chạy trốn lấy thẻ tín dụng của bạn và kính râm của bạn với họ.

  • Nếu bạn sử dụng

    cur.execute("""
        INSERT INTO some_table (id, created_at, last_name)
        VALUES (%s, %s, %s);
        """,
        (10, datetime.date(2020, 11, 18), "O'Reilly"))
    
    0 để hợp nhất giá trị văn bản thành một chuỗi, kẻ xấu ở Balaclava sẽ tìm đường đến tủ lạnh của bạn, uống tất cả bia của bạn và để chỗ ngồi vệ sinh của bạn lên và giấy vệ sinh của bạn theo hướng sai.

  • Bạn không muốn hợp nhất các giá trị theo cách thủ công với một truy vấn: sử dụng các phương thức được cung cấp thay thế.use the provided methods instead.

Cách chính xác để truyền các biến trong lệnh SQL là sử dụng đối số thứ hai của phương thức

# Multiple values single statement/execution
c.execute('SELECT * FROM stocks WHERE symbol=? OR symbol=?', ('RHAT', 'MSO'))
print c.fetchall()
c.execute('SELECT * FROM stocks WHERE symbol IN (?, ?)', ('RHAT', 'MSO'))
print c.fetchall()
# This also works, though ones above are better as a habit as it's inline with syntax of executemany().. but your choice.
c.execute('SELECT * FROM stocks WHERE symbol=? OR symbol=?', 'RHAT', 'MSO')
print c.fetchall()
# Insert a single item
c.execute('INSERT INTO stocks VALUES (?,?,?,?,?)', ('2006-03-28', 'BUY', 'IBM', 1000, 45.00))
9:

# Multiple values single statement/execution
c.execute('SELECT * FROM stocks WHERE symbol=? OR symbol=?', ('RHAT', 'MSO'))
print c.fetchall()
c.execute('SELECT * FROM stocks WHERE symbol IN (?, ?)', ('RHAT', 'MSO'))
print c.fetchall()
# This also works, though ones above are better as a habit as it's inline with syntax of executemany().. but your choice.
c.execute('SELECT * FROM stocks WHERE symbol=? OR symbol=?', 'RHAT', 'MSO')
print c.fetchall()
# Insert a single item
c.execute('INSERT INTO stocks VALUES (?,?,?,?,?)', ('2006-03-28', 'BUY', 'IBM', 1000, 45.00))
3

Ghi chú

Trình kiểm tra mã tĩnh Python chưa hoàn toàn ở đó, nhưng trong tương lai, có thể kiểm tra mã của bạn để sử dụng không đúng các biểu thức chuỗi trong các truy vấn. Xem kiểm tra các chuỗi theo nghĩa đen trong các truy vấn để biết chi tiết.Checking literal strings in queries for details.

Thông số nhị phân và kết quả#

PostgreSQL có hai cách khác nhau để truyền dữ liệu giữa máy khách và máy chủ:

INSERT INTO some_table (id, created_at, last_name)
VALUES (10, '2020-11-18', 'O''Reilly');
0, luôn luôn có sẵn và
INSERT INTO some_table (id, created_at, last_name)
VALUES (10, '2020-11-18', 'O''Reilly');
1, có sẵn hầu hết thời gian nhưng không phải lúc nào cũng vậy. Thông thường định dạng nhị phân hiệu quả hơn để sử dụng.

PSYCOPG có thể hỗ trợ cả hai định dạng cho từng loại dữ liệu. Bất cứ khi nào một giá trị được chuyển cho một truy vấn bằng cách sử dụng trình giữ chỗ

SELECT some, fields FROM some_table WHERE id = ...
0 bình thường, định dạng tốt nhất hiện có (thường xuyên, nhưng không phải lúc nào, định dạng nhị phân được chọn làm lựa chọn tốt nhất).

Nếu bạn có lý do để chọn rõ ràng định dạng nhị phân hoặc định dạng văn bản cho một giá trị bạn có thể sử dụng tương ứng là trình giữ chỗ

cur.execute("""
    INSERT INTO some_table (id, created_at, last_name)
    VALUES (%s, %s, %s);
    """,
    (10, datetime.date(2020, 11, 18), "O'Reilly"))
4 hoặc trình giữ chỗ
cur.execute("""
    INSERT INTO some_table (id, created_at, last_name)
    VALUES (%s, %s, %s);
    """,
    (10, datetime.date(2020, 11, 18), "O'Reilly"))
5 thay vì
SELECT some, fields FROM some_table WHERE id = ...
0 bình thường.
# Multiple values single statement/execution
c.execute('SELECT * FROM stocks WHERE symbol=? OR symbol=?', ('RHAT', 'MSO'))
print c.fetchall()
c.execute('SELECT * FROM stocks WHERE symbol IN (?, ?)', ('RHAT', 'MSO'))
print c.fetchall()
# This also works, though ones above are better as a habit as it's inline with syntax of executemany().. but your choice.
c.execute('SELECT * FROM stocks WHERE symbol=? OR symbol=?', 'RHAT', 'MSO')
print c.fetchall()
# Insert a single item
c.execute('INSERT INTO stocks VALUES (?,?,?,?,?)', ('2006-03-28', 'BUY', 'IBM', 1000, 45.00))
8 sẽ thất bại nếu
INSERT INTO some_table (id, created_at, last_name)
VALUES (10, '2020-11-18', 'O''Reilly');
7 cho đúng kiểu dữ liệu và định dạng không có sẵn.

Hai định dạng tương tự, văn bản hoặc nhị phân, được PostgreSQL sử dụng để trả lại dữ liệu từ truy vấn cho máy khách. Không giống như với các tham số, trong đó bạn có thể chọn định dạng giá trị theo giá trị, tất cả các cột được trả về bởi một truy vấn sẽ có cùng định dạng. Mỗi loại được trả về bởi truy vấn phải có cấu hình

INSERT INTO some_table (id, created_at, last_name)
VALUES (10, '2020-11-18', 'O''Reilly');
8, nếu không dữ liệu sẽ được trả về dưới dạng
INSERT INTO some_table (id, created_at, last_name)
VALUES (10, '2020-11-18', 'O''Reilly');
9 (đối với kết quả văn bản) hoặc bộ đệm (cho kết quả nhị phân).

Ghi chú

Bảng PG_TYPE xác định định dạng nào được hỗ trợ cho từng loại dữ liệu PostgreSQL. Đầu vào/đầu ra văn bản được quản lý bởi các hàm được khai báo trong các trường

cur.execute("""
    INSERT INTO some_table (id, created_at, updated_at, last_name)
    VALUES (%(id)s, %(created)s, %(created)s, %(name)s);
    """,
    {'id': 10, 'name': "O'Reilly", 'created': datetime.date(2020, 11, 18)})
0 và
cur.execute("""
    INSERT INTO some_table (id, created_at, updated_at, last_name)
    VALUES (%(id)s, %(created)s, %(created)s, %(name)s);
    """,
    {'id': 10, 'name': "O'Reilly", 'created': datetime.date(2020, 11, 18)})
1 (luôn luôn có mặt), đầu vào/đầu ra nhị phân được quản lý bởi
cur.execute("""
    INSERT INTO some_table (id, created_at, updated_at, last_name)
    VALUES (%(id)s, %(created)s, %(created)s, %(name)s);
    """,
    {'id': 10, 'name': "O'Reilly", 'created': datetime.date(2020, 11, 18)})
2 và
cur.execute("""
    INSERT INTO some_table (id, created_at, updated_at, last_name)
    VALUES (%(id)s, %(created)s, %(created)s, %(name)s);
    """,
    {'id': 10, 'name': "O'Reilly", 'created': datetime.date(2020, 11, 18)})
3 (là tùy chọn).

Bởi vì không phải mọi loại PostgreSQL đều hỗ trợ đầu ra nhị phân, theo mặc định, dữ liệu sẽ được trả về ở định dạng văn bản. Để trả về dữ liệu ở định dạng nhị phân, bạn có thể tạo con trỏ bằng cách sử dụng

cur.execute("""
    INSERT INTO some_table (id, created_at, updated_at, last_name)
    VALUES (%(id)s, %(created)s, %(created)s, %(name)s);
    """,
    {'id': 10, 'name': "O'Reilly", 'created': datetime.date(2020, 11, 18)})
4
cur.execute("""
    INSERT INTO some_table (id, created_at, updated_at, last_name)
    VALUES (%(id)s, %(created)s, %(created)s, %(name)s);
    """,
    {'id': 10, 'name': "O'Reilly", 'created': datetime.date(2020, 11, 18)})
5 hoặc thực hiện truy vấn bằng cách sử dụng
cur.execute("""
    INSERT INTO some_table (id, created_at, updated_at, last_name)
    VALUES (%(id)s, %(created)s, %(created)s, %(name)s);
    """,
    {'id': 10, 'name': "O'Reilly", 'created': datetime.date(2020, 11, 18)})
6
cur.execute("""
    INSERT INTO some_table (id, created_at, updated_at, last_name)
    VALUES (%(id)s, %(created)s, %(created)s, %(name)s);
    """,
    {'id': 10, 'name': "O'Reilly", 'created': datetime.date(2020, 11, 18)})
5. Một trường hợp yêu cầu kết quả nhị phân là một người chiến thắng rõ ràng là khi bạn có dữ liệu nhị phân lớn trong cơ sở dữ liệu, chẳng hạn như hình ảnh:

# Multiple values single statement/execution
c.execute('SELECT * FROM stocks WHERE symbol=? OR symbol=?', ('RHAT', 'MSO'))
print c.fetchall()
c.execute('SELECT * FROM stocks WHERE symbol IN (?, ?)', ('RHAT', 'MSO'))
print c.fetchall()
# This also works, though ones above are better as a habit as it's inline with syntax of executemany().. but your choice.
c.execute('SELECT * FROM stocks WHERE symbol=? OR symbol=?', 'RHAT', 'MSO')
print c.fetchall()
# Insert a single item
c.execute('INSERT INTO stocks VALUES (?,?,?,?,?)', ('2006-03-28', 'BUY', 'IBM', 1000, 45.00))
4

Bạn có thể sử dụng Python để truy vấn dữ liệu không?

Dữ liệu truy vấn có nghĩa là yêu cầu dữ liệu cụ thể từ bộ dữ liệu.Nếu bạn quen thuộc với SQL, bạn phải biết ý nghĩa của dữ liệu, nhưng nếu bạn sử dụng thư viện Pandas trong Python, bạn vẫn có thể truy vấn dữ liệu từ bộ dữ liệu của mình.if you use the pandas library in Python, you can still query data from your dataset.

Việc sử dụng %% trong SQL là gì?

Dấu phần trăm (%) đại diện cho số 0, một hoặc nhiều ký tự.Dấu gạch dưới (_) đại diện cho một, ký tự đơn.represents zero, one, or multiple characters. The underscore sign (_) represents one, single character.

Truy vấn biến là gì?

Trong định nghĩa của một truy vấn mới (xem định nghĩa về truy vấn), bạn có thể xác định các biến truy vấn.Các biến là người giữ chỗ trong các tiêu chí lựa chọn của truy vấn.Trong quá trình xử lý truy vấn, hệ thống thay thế các biến bằng các giá trị cụ thể mà bạn đã nhập thủ công hoặc hệ thống đã tự động xác định.placeholders in the selection criteria of the query. During query processing, the system replaces variables with specific values that you have entered manually or the system has determined automatically.