SQL / Python学校计划

时间:2012-03-13 21:51:17

标签: python

我有一个Python脚本的学校项目,它运行一个SQL查询并将结果吐出到一个文件......到目前为止,我有这个想要一些反馈,如果这看起来正确或我离开了(我' m使用adodbapi)。非常感谢!

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 个答案:

答案 0 :(得分: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程序。如果数据库服务器位于远程计算机上,则可能非常慢。
    • 您的程序必须在工作开始前为整个数据集分配内存。这可能是几百兆字节。
  4. 更多的Pythonic方法是避免将整个数据集加载到内存中,除非必须这样做。使用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解释为名为txt的变量的属性test_file。这将为您提供NameError,因为没有名为test_file的变量,或者可能是AttributeError

    2. 如果要在不必连接到网络数据库的情况下测试代码,请使用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'