1

原始代碼:AttributeError的:在蟒蛇__ exit__ 3.4

import sys 
import os 
import latexmake 

import mysql.connector 
conn = mysql.connector.connect(user='root',password='oilwell',host='localhost',database='sqlpush1') 

with conn: 
    mycursor = conn.cursor() 
mycursor=execute("SELECT DATE,oil,gas,oilprice,gasprice,totrev FROM results WHERE DATE BETWEEN '2011-01-01' AND '2027-12-01'") 
rows = mycursor.fetchall() 
a.write("\\documentclass{standalone}\\usepackage{booktabs}\n\n\\usepackage{siunitx}\r \n\ 
\r\n\\begin{document}\r\n\\begin{tabular}{ccS[table-format = 5.2]} \\\\ \\toprule\r") 
a.write("Date & Oil & Gas & Oil price & Gas price & Total Revenue \\\\ \\midrule \r") 
for row in rows: 
    a = open("testtest.tex", "w") 
    a.write("" + str(row[0]) + " & " + str(row[1]) + " & " + str(row[2]) + " & " + str(row[3]) + " & " + str(row[4]) + " & " + str(row[5]) + " \\\\ \r") 

    a.write("\\bottomrule \\end{tabular}\r\\end{document}") 
    a.close 
print (os.path.getsize("testtest.tex")) 
os.system('latexmk.py -q testtest.tex') 
mycursor.close() 
conn.close() 
a.close() 

由空轉後,和紅色的錯誤彈出像

Traceback (most recent call last): 
    File "C:\Users\Cheng XXXX\Desktop\tabletest.py", line 8, in <module> 
    with conn: 
AttributeError: __exit__ 

我檢查了文件,不能文件錯誤,需要幫助。

+0

'conn'不是一個上下文管理器,它是'with'試圖存儲'conn .__ exit__'在上下文退出時調用。 –

+0

@MartijnPieters你能更具體嗎?我該如何解決這個案子?非常感謝。 –

+0

不要使用'mysql.connector'連接作爲上下文管理器。它可能與其他MySQL庫一起工作,但不是這一個。 –

回答

2

您正在嘗試使用的連接作爲一個上下文管理器:

with conn: 

該對象未實現必要的方法那樣使用;它不是一個上下文管理器,因爲它缺少(至少)__exit__ method

如果你正在讀一個使用不同 MySQL庫的教程或文檔,請注意,此功能可以通過一些庫,只是沒有這一個支持。例如,MySQLdb project確實支持它。

對於您的具體的的情況下,你甚至不需要使用with conn:行;您沒有對數據庫進行任何更改,任何地方都不需要提交。你可以安全地刪除with conn:行(在它下面的一切步驟unindent所有)。否則,您可以在其他地方使用手動conn.commit()替換上下文管理器。

或者,你可以創建這個用例自己的上下文管理,使用@contextlib.contextmanager() decorator

from contextlib import contextmanager 

@contextmanager 
def manage_transaction(conn, *args, **kw): 
    exc = False 
    try: 
     try: 
      conn.start_transaction(*args, **kw) 
      yield conn.cursor() 
     except: 
      exc = True 
      conn.rollback() 
    finally: 
     if not exc: 
      conn.commit() 

,並以此作爲:

with manage_transaction(conn) as cursor: 
    # do things, including creating extra cursors 

在那裏你可以在額外的參數傳遞connection.start_transaction() call

+0

我的python版本是3.4,MySQLdb不支持它。那麼,有沒有辦法用MySQL Connector/Python執行這個腳本? Python的新手,非常感謝您的時間。 –

+0

@程張:你可以,只是不使用這一功能。您可以使用我的替代方案,或者刪除'with conn:'行(其餘的爲unindent),並在末尾添加一個顯式的'conn.commit()'。 –

+0

@Martjin Pieters你的意思是刪除「with conn」並在最後加上「conn.commit()」? –