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: (не забудьте все под ней на один шаг). В противном случае вы можете заменить диспетчера контекста на руководство 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

@ChengZhang: вы можете просто не использовать эту функцию. Вы можете использовать мою альтернативу или удалить строку 'with conn:' (unindent остальное) и добавить вместо этого явный 'conn.commit()'. –

+0

@Martjin Pieters Вы имеете в виду удалить «с conn» и поставить «conn.commit()» в самом конце? –

Смежные вопросы