2008-11-25 22 views
5

Tôi đang cố gắng tìm hiểu chính xác những gì dòng sau đây - cụ thể là phần %% s?Newbie Python đặt câu hỏi về chuỗi có thông số: "%% s"?

cursor.execute('INSERT INTO mastertickets (%s, %s) VALUES (%%s, %%s)'%sourcedest, (self.tkt.id, n)) 

Bất kỳ hướng dẫn nhỏ nào về định dạng chuỗi và chèn biến vào chuỗi bằng Python?

+0

Đó là một đoạn mã stinky. bạn đã tìm thấy nó ở đâu? Đó là điều tôi muốn tránh. –

+0

plugin mastertickets cho trac – Epaga

+0

oh và ra khỏi tò mò ... tôi đồng ý nó không phải là rất dễ đọc (do đó câu hỏi;), nhưng làm thế nào nên làm điều đó thay thế? – Epaga

Trả lời

6

Các %% trở thành một đơn %. Mã này về cơ bản đang làm hai cấp độ định dạng chuỗi. Đầu tiên là %sourcedest được thực hiện để biến mã của bạn chủ yếu vào:

cursor.execute('INSERT INTO mastertickets (BLAH, FOO) VALUES (%s, %s)', (self.tkt.id, n)) 

sau đó lớp db áp dụng các thông số để các khe còn sót lại.

Cần gấp đôi% để có được các vị trí của db được chuyển qua thao tác định dạng chuỗi đầu tiên một cách an toàn.

1

%% biến thành một% đơn

4

"nhưng thay vào đó phải làm như thế nào?"

Cuộc gọi khó khăn. Vấn đề là họ đang cắm siêu dữ liệu (cụ thể là các tên cột) khi đang bay vào một câu lệnh SQL. Tôi không phải là một fan hâm mộ lớn của loại điều này. Biến số sourcedest có hai tên cột sẽ được cập nhật.

Tỷ lệ cược tốt là chỉ có một (hoặc một vài) cặp tên cột thực sự được sử dụng. Sở thích của tôi là làm điều này.

if situation1: 
    stmt= "INSERT INTO mastertickets (this, that) VALUES (?, ?)" 
elif situation2: 
    stmt= "INSERT INTO mastertickets (foo, bar) VALUES (?, ?)" 
else: 
    raise Exception("Bad configuration -- with some explanation") 
cursor.execute(stmt, (self.tkt.id, n)) 

Khi có nhiều kết hợp cột hợp lệ cho loại điều này, nó cho biết rằng mô hình dữ liệu đã hợp nhất hai thực thể thành một bảng duy nhất, một vấn đề thiết kế cơ sở dữ liệu chung. Vì bạn đang làm việc với một sản phẩm và một trình cắm thêm, bạn không thể làm gì nhiều với các vấn đề về mô hình dữ liệu.

3

Việc đặt tên cột được chèn bằng định dạng chuỗi không quá tệ, miễn là chúng không được người dùng cung cấp. Các giá trị nên tham số truy vấn mặc dù:

stmt = "INSERT INTO mastertickets (%s, %s) VALUES (?, ?)" % srcdest 
... 
cursor.execute(stmt, (self.tkt.id, n)) 
0

Nó cũng làm như vậy:

cursor.execute('INSERT INTO mastertickets (%s, %s) VALUES (:%s, :%s)' % \ 
    tuple(sourcedest + sourcedest), dict(zip(sourcedest, (self.tkt.id, n)))) 

Không bao giờ làm điều đó.

+0

đừng lo lắng. tôi sẽ không. o_O – Epaga