2012-02-16 13 views
11

Tôi đang sử dụng mô-đun MySQLdb cho Python (v1.2.3 được biên dịch trước nhị phân cho Windows Python 2.7) để đọc và ghi dữ liệu vào cơ sở dữ liệu MySQL . Khi kết nối được mở, tôi có thể sử dụng kết nối đó để quan sát các thay đổi được thực hiện cho cơ sở dữ liệu trên cùng một kết nối đó, nhưng không thấy các thay đổi được thực hiện bằng kết nối khác, bất kể kết nối khác được thực hiện bằng Python hay không. ứng dụng dòng lệnh MySQL. Trong trường hợp tôi đang cập nhật bằng Python, lưu ý rằng tôi đang chạy lệnh commit() trên kết nối.Kết nối MySQL-python không thấy thay đổi đối với cơ sở dữ liệu được thực hiện trên kết nối khác ngay cả sau khi thay đổi được cam kết

Ví dụ về chương trình chèn kỷ lục mới vào bảng thử nghiệm với một cột VARCHAR:

import MySQLdb 

conn = MySQLdb.connect("localhost", "test", "test", "test") 
c = conn.cursor() 
c.execute("INSERT INTO test VALUES(%s)", ("Test",)) 
conn.commit() 
c.close() 
conn.close() 

Ví dụ về chương trình kết thúc in một số lượng kỷ lục liên tục (thay vì in nhất ghi vào nhật đếm). Tôi chỉ có thể cập nhật số lượng bằng cách giết và chạy lại tập lệnh hoặc bằng cách mở một kết nối mới mỗi khi câu lệnh SELECT được chạy.

import MySQLdb 

conn = MySQLdb.connect("localhost", "test", "test", "test") 

while True: 
    input = raw_input("Enter anything: ") 
    if input == "exit": 
     break 

    c = conn.cursor() 
    c.execute("SELECT COUNT(*) FROM test") 
    res = c.fetchone()[0] 
    c.close() 

    print("Number of records: %d" % res) 

Trả lời

5

Hãy thử điều này

import MySQLdb 
import time 

from MySQLdb.cursors import SSCursor 
conn = MySQLdb.connect("localhost", "test", "test", "test") 


while True: 
    input = raw_input("Enter anything: ") 
    if input == "exit": 
     break 
    c = conn.cursor() 
    conn.begin() 
    c.execute("SELECT COUNT(*) FROM test") 
    res = c.fetchone()[0] 
    #c.commit() 
    c.close() 

    print("Number of records: %d" % res) 

Định nghĩa của cursor là nó sẽ lưu trữ dữ liệu cho đến khi sự thay đổi của nó. Vì vậy, bạn phải đưa dấu hiệu cho con trỏ bằng cách begin ing hoặc commit nhập kết nối của bạn. Điều này sẽ thông báo cho con trỏ rằng bạn phải đọc dữ liệu mới từ cơ sở dữ liệu.

Hy vọng điều này sẽ giải quyết truy vấn của bạn.

Chúng tôi cũng tìm hiểu những điều mới từ câu hỏi của bạn :).

+2

'Ngừng sử dụngCảnh báo: begin() không chuẩn và sẽ bị xóa trong 1.3' –

+1

Nhận xét' conn.begin() 'và bỏ ghi chú' conn.commit() '. Điều đó cũng sẽ hoạt động. – Nilesh