2012-03-13 71 views
0

我有一個Python腳本的學校項目,它運行一個SQL查詢並將結果吐出到一個文件中......我有這個到目前爲止,想要一些反饋,如果這看起來正確或如果我是(我正在使用adodbapi)。非常感謝!SQL/Python學校計劃

import adodbapi 

# Connect to the SQL DB 

conn = adodbapi.connect("Provider=SQLDB;SERVER= x.x.x.x ;User Id=user;Password=pass;DATABASE=db database;") 
curs = conn.cursor() 

# Execute SQL query test_file.sql" 

query = 'test_file' 
curs.execute("SELECT test_file") 
rows = curs.fetchall() 
for row in rows: 
    print test_file | test_file.txt 


conn.close() 
+1

是否有問題或具體問題? – Dan 2012-03-13 21:52:16

+0

是的,我基本上是看它是否設置正確,因爲它是所有使用「虛構」數據庫時,我編譯它只是說未能登錄,所以我不知道如果查詢和部分工作正確......這是我在py上的第一個冒險,所以在尋找一些幫助,如果這工作正確 – user1267605 2012-03-13 22:00:36

+2

看起來你甚至沒有嘗試運行這個。 'test_file'會引發一個'NameError'。 – 2012-03-13 22:12:22

回答

0
  1. # Execute SQL query test_file.sql"您還沒有執行從文件中的SQL查詢。您正在執行SQL查詢"SELECT test_file"
  2. "SELECT test_file"對於SELECT查詢是無效的SQL語法。 See this tutorial on the SELECT statement.
  3. rows = curs.fetchall(); for row in rows: ...不是迭代查詢的所有結果的好方法。
    • 如果您的查詢返回大量行,比如說一百萬行,那麼在循環啓動之前,所有一百萬行都必須從數據庫傳輸到您的python程序。如果數據庫服務器位於遠程計算機上,這可能是非常慢
    • 在開始工作之前,您的程序必須爲整個數據集分配內存。這可能是幾百兆字節。

這樣做的更Python的方法是避免加載整個數據集到內存,除非你要。使用sqlite3我會寫:

results = curs.execute("SELECT * FROM table_name") 
for row in results: 
    print (row) 

這樣只有一行在同一時間被加載。

  1. print test_file | test_file.txtprint語句不支持管道操作員寫入文件。 (Python不是Linux shell!)請參閱Python File I/O. 此外,即使此語法正確,也無法將文件名放在'quote marks'中。如果沒有引號,Python會將test_file.txt解釋爲test_file變量的屬性txt。這會給你一個NameError,因爲沒有變量叫做test_file,或者可能是AttributeError

如果您希望在不必連接到網絡數據庫來測試你的代碼,然後使用the sqlite3 module。這是一個內置的Python庫,實現了一個類似於adodbapi的數據庫。

import sqlite3 
db_conn = sqlite3.connect(":memory:") # connect to temporary database 
db_conn.execute("CREATE TABLE colours (Name TEXT, Red INT, Green INT, Blue INT)") 
db_conn.execute("INSERT INTO colours VALUES (?,?,?,?)", ('gray', 128, 128, 128)) 
db_conn.execute("INSERT INTO colours VALUES (?,?,?,?)", ('blue', 0, 0, 255)) 
results = db_conn.execute("SELECT * FROM colours") 
for row in results: 
    print (row) 

今後請嘗試運行您的代碼,或者至少測試一下各條線是否符合您的期望。嘗試print test_file | test_file.txt在口譯員會給你一個TypeError: unsupported operand type(s) for |: 'str' and 'str'