2013-10-20 18 views
18

Tôi đang nghiên cứu cách thực hiện SQL trong python (tôi biết SQL, không phải Python).đọc kịch bản sql bên ngoài trong python

Tôi có tệp sql bên ngoài. Nó tạo và chèn dữ liệu vào ba bảng 'Zookeeper', 'Handles', 'Animal'.

Sau đó, tôi có một loạt truy vấn để chạy các bảng. Các truy vấn dưới đây nằm trong tệp zookeeper.sql mà tôi tải ở đầu tập lệnh python. Ví dụ cho hai người đầu tiên là:

--1.1 

SELECT ANAME,zookeepid 
FROM ANIMAL, HANDLES 
WHERE AID=ANIMALID; 

--1.2

SELECT ZNAME, SUM(TIMETOFEED) 
FROM ZOOKEEPER, ANIMAL, HANDLES 
WHERE AID=ANIMALID AND ZOOKEEPID=ZID 
GROUP BY zookeeper.zname; 

Những bài thi tốt trong SQL. Bây giờ tôi cần thực thi chúng từ bên trong Python. Tôi đã được cung cấp và hoàn thành mã để đọc trong tập tin. Sau đó, thực hiện tất cả các truy vấn trong vòng lặp.

1,1 và 1,2 là nơi tôi bị nhầm lẫn. Tôi tin rằng trong vòng lặp này là dòng mà tôi nên đặt trong một cái gì đó để chạy truy vấn đầu tiên và sau đó thứ hai.

kết quả = c.execute ("SELECT * FROM% s;"% table);

nhưng sao? Tôi nghĩ rằng tôi đang thiếu một cái gì đó rất rõ ràng. Tôi nghĩ những gì đang ném tôi ra là% bảng. Trong truy vấn 1.1 và 1.2, tôi không tạo bảng, mà là tìm kết quả truy vấn.

Toàn bộ mã trăn của tôi ở bên dưới.

import sqlite3 
from sqlite3 import OperationalError 

conn = sqlite3.connect('csc455_HW3.db') 
c = conn.cursor() 

# Open and read the file as a single buffer 
fd = open('ZooDatabase.sql', 'r') 
sqlFile = fd.read() 
fd.close() 

# all SQL commands (split on ';') 
sqlCommands = sqlFile.split(';') 

# Execute every command from the input file 
for command in sqlCommands: 
    # This will skip and report errors 
    # For example, if the tables do not yet exist, this will skip over 
    # the DROP TABLE commands 
    try: 
     c.execute(command) 
    except OperationalError, msg: 
     print "Command skipped: ", msg 


# For each of the 3 tables, query the database and print the contents 
for table in ['ZooKeeper', 'Animal', 'Handles']: 


    **# Plug in the name of the table into SELECT * query 
    result = c.execute("SELECT * FROM %s;" % table);** 

    # Get all rows. 
    rows = result.fetchall(); 

    # \n represents an end-of-line 
    print "\n--- TABLE ", table, "\n" 

    # This will print the name of the columns, padding each name up 
    # to 22 characters. Note that comma at the end prevents new lines 
    for desc in result.description: 
     print desc[0].rjust(22, ' '), 

    # End the line with column names 
    print "" 
    for row in rows: 
     for value in row: 
      # Print each value, padding it up with ' ' to 22 characters on the right 
      print str(value).rjust(22, ' '), 
     # End the values from the row 
     print "" 

c.close() 
conn.close() 
+0

Bạn đang thực thi truy vấn SQL nào, các truy vấn 1.1 và 1.2, hoặc chỉ lấy mọi thứ từ mọi bảng? – Azeirah

+0

Tôi muốn chạy 1.1 và 1.2 (cộng với tôi có khoảng 6 người khác) từ tệp .sql. – mpg

+0

Tôi đang đi một chút quá nhanh Tôi tin rằng, bạn cần giúp đỡ để hiểu mã hoặc bạn cần giúp chỉnh sửa mã của bạn để làm một cái gì đó thêm? – Azeirah

Trả lời

46

Mã của bạn đã có chứa một cách đẹp để thực hiện tất cả các báo cáo từ một tập tin sql định

# Open and read the file as a single buffer 
fd = open('ZooDatabase.sql', 'r') 
sqlFile = fd.read() 
fd.close() 

# all SQL commands (split on ';') 
sqlCommands = sqlFile.split(';') 

# Execute every command from the input file 
for command in sqlCommands: 
    # This will skip and report errors 
    # For example, if the tables do not yet exist, this will skip over 
    # the DROP TABLE commands 
    try: 
     c.execute(command) 
    except OperationalError, msg: 
     print "Command skipped: ", msg 

Gói này trong một hàm và bạn có thể tái sử dụng nó.

def executeScriptsFromFile(filename): 
    # Open and read the file as a single buffer 
    fd = open(filename, 'r') 
    sqlFile = fd.read() 
    fd.close() 

    # all SQL commands (split on ';') 
    sqlCommands = sqlFile.split(';') 

    # Execute every command from the input file 
    for command in sqlCommands: 
     # This will skip and report errors 
     # For example, if the tables do not yet exist, this will skip over 
     # the DROP TABLE commands 
     try: 
      c.execute(command) 
     except OperationalError, msg: 
      print "Command skipped: ", msg 

Để sử dụng nó

executeScriptsFromFile('zookeeper.sql') 

Bạn nói bạn đã nhầm lẫn bởi

result = c.execute("SELECT * FROM %s;" % table); 

Trong Python, bạn có thể thêm công cụ để một chuỗi bằng cách sử dụng một cái gì đó gọi là chuỗi định dạng.

Bạn có chuỗi "Some string with %s" với% s, đó là trình giữ chỗ cho nội dung khác. Để thay thế placeholder, bạn thêm% ("những gì bạn muốn thay thế nó bằng") sau chuỗi của bạn

ví dụ:

a = "Hi, my name is %s and I have a %s hat" % ("Azeirah", "cool") 
print(a) 
>>> Hi, my name is Azeirah and I have a Cool hat 

Bit của một ví dụ trẻ con, nhưng nó phải được rõ ràng.

Bây giờ, những gì

result = c.execute("SELECT * FROM %s;" % table); 

phương tiện, là nó thay thế% s với giá trị của biến bảng.

(tạo ra trong)

for table in ['ZooKeeper', 'Animal', 'Handles']: 


# for loop example 

for fruit in ["apple", "pear", "orange"]: 
    print fruit 
>>> apple 
>>> pear 
>>> orange 

Nếu bạn có bất kỳ thắc mắc nào khác, chọc tôi.

+1

Vui lòng đặt câu hỏi của tôi ở chế độ ngoại tuyến, nhưng làm cách nào để bạn chú ý đến SOF? Tôi cắm vào những gì tôi nghĩ rằng bạn đang nói về và có một loạt các lỗi. Vì vậy, tôi vẫn không nhận được một cái gì đó. MPG – mpg

+0

Ồ, không có "sự chọc" chính thức trong SO, theo nghĩa của tôi, bạn vừa chọc tôi. Tôi nghĩ tốt nhất là bạn nên làm quen với cách Python hoạt động tổng thể, vì tôi không thể khắc phục mọi vấn đề của bạn từng cái một (ngay cả khi tôi làm, lần tới bạn muốn làm điều gì đó bạn không thể). [Trang web này] (http://www.codecademy.com/) chắc chắn sẽ giúp bạn hiểu cú pháp cơ bản của python. – Azeirah

+1

Rất hữu ích; chắc chắn một cái gì đó tôi sẽ được tiết kiệm để tham khảo trong tương lai! Một [tinh chỉnh nhỏ] (http://pastebin.com/Wy884qCJ) để làm việc với python 3 ... – memilanuk

Các vấn đề liên quan