1

元のコード:

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()

IDLEで実行した後、赤いエラーがポップアップします

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

ファイルを確認しましたが、間違いをファイ​​ルできません。助けが必要です。

4

1 に答える 1

3

接続をコンテキスト マネージャーとして使用しようとしています:

with conn:

このオブジェクトは、そのように使用するために必要なメソッドを実装していません。(少なくとも) __exit__methodがないため、コンテキスト マネージャーではありません。

別のMySQL ライブラリを使用するチュートリアルまたはドキュメントを読んでいる場合、この機能は一部のライブラリでサポートされている可能性があることに注意してください。たとえば、MySQLdb プロジェクトはそれをサポートしています。

特定のケースでは、with conn:行を使用する必要さえありません。データベースに変更を加えていないため、コミットはどこにも必要ありません。行を安全に削除できますwith conn:(その下のすべてのインデントを 1 ステップ解除します)。それ以外の場合は、コンテキスト マネージャーを他の場所のマニュアルに置き換えることができますconn.commit()

@contextlib.contextmanager()または、デコレータを使用して、このユースケース用に独自のコンテキスト マネージャを作成することもできます。

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に追加の引数を渡すことができます。

于 2015-06-11T15:17:25.923 に答える