Não é possível inserir dados mysql usando python com pymysql [closed]

0

Estou usando o python cuja versão é 3.x.x. Em python 3.x.x como você sabe, não há biblioteca para o MySQL. Por esse motivo, estou tentando usar o pymysql para conectar meu banco de dados. Ao usar o pymysql, não consigo inserir dados no meu banco de dados (sou o BEGINNER). Quando eu corro este script eu tenho:

Traceback (most recent call last):
File "home/pi ......
cur.execute(sql)
Name:Error: cur is not defined.

Como posso consertar isso? Como posso definir cursor.execute? Eu chamei biblioteca para isso porque eu tenho que definir isso de novo?

Aqui está o meu código. Eu apaguei a parte que não é necessária para este problema.

import os
import time
import datetime
import glob
import mysql.connector
from mysql.connector import errorcode
from time import strftime

os.system('modprobe w1-gpio')
os.system('modprobe w1-therm')

base_dir = '/sys/bus/w1/devices/'
device_folder = glob.glob(base_dir + '28-000008a43c0e')[0]
device_file = device_folder + '/w1_slave'


#---------------------------------------------------------------------------
#Connect MySQL
#---------------------------------------------------------------------------

cnx = mysql.connector.connect(user='root',password='mehmetali',
                              host='localhost',
                              database='temp-at-interrupt')


cursor= cnx.cursor()

#---------------------------------------------------------------------------
#Get Temperature Values.
#---------------------------------------------------------------------------

def read_temp_raw():
    f = open(device_file, 'r')
    lines = f.readlines()
    f.close()
    return lines
def read_temp():
    lines = read_temp_raw()
    while lines[0].strip()[-3:] != 'YES':
        time.sleep(0.2)
        lines = read_temp_raw()
    equals_pos = lines[1].find('t=')
    if equals_pos != -1:
        temp_string = lines[1][equals_pos+2:]
        temp_c = float(temp_string) / 1000.0
        return temp_c

#---------------------------------------------------------------------------
#Insert new data
#---------------------------------------------------------------------------
if True:
    temp=read_temp()
    print(temp)
    datetimeWrite = (time.strftime("%Y-%m-%d ") + time.strftime("%H:%M:%S"))
    print (datetimeWrite)
    #sql= ("""INSERT INTO 'temp-at-interrupt' (Date,Time,Temperature) VALUES (%s,%s,%s )""",(datetimeWrite,temp))
    sql = ("""INSERT INTO 'temp-at-interrupt' ('Date','Time','Temperature') VALUES ('%s','%s','%s' )""",(datetimeWrite,temp))
try:
    print ("Writing to database...")
# Execute the SQL command
    cursor.execute(sql)
# Commit your changes in the database
    cnx.commit()
    print ("Write Complete")
except:
# Rollback in case there is any error
    cursor.close()
    cnx.close()
    print ("Failed writing to database")

UPDATE : Quando eu sigo a sequência '' Você tem que configurar sua conexão, definir seu cursor, executar suas consultas, e depois de terminar a consulta você pode fechar a conexão . '' Eu corri meus erros. Mas eu ainda estou preso aqui. Minha saída é assim.

25.35 C
2018-04-20 22:21:04
Writing to Database...
Failed writing to database

Onde estou errado aqui?

    
por Njord Nyström 20.04.2018 / 20:49

2 respostas

2

Você entendeu mal como usar a interface do Python.

cnx = mysql.connector.connect(user='root',password='******',
                              host='localhost',
                              database='temp-at-interrupt')
cnx.close()

Aqui você se conecta e fecha a conexão. Depois disso, sem nunca definir seu cursor cur , você tenta executar uma consulta com ele. Isso não vai funcionar.

Você precisa configurar sua conexão, definir seu cursor, executar suas consultas e, depois de concluir a consulta, fechar a conexão.

A documentação do mysql fornece este exemplo, que mostra o fluxo dele:

import mysql.connector

cnx = mysql.connector.connect(user='scott', database='employees')
cursor = cnx.cursor()

tomorrow = datetime.now().date() + timedelta(days=1)

add_employee = ("INSERT INTO employees "
               "(first_name, last_name, hire_date, gender, birth_date) "
               "VALUES (%s, %s, %s, %s, %s)")
add_salary = ("INSERT INTO salaries "
              "(emp_no, salary, from_date, to_date) "
              "VALUES (%(emp_no)s, %(salary)s, %(from_date)s, %(to_date)s)")

data_employee = ('Geert', 'Vanderkelen', tomorrow, 'M', date(1977, 6, 14))

# Insert new employee
cursor.execute(add_employee, data_employee)

emp_no = cursor.lastrowid

# Insert salary information
data_salary = {
  'emp_no': emp_no,
  'salary': 50000,
  'from_date': tomorrow,
  'to_date': date(9999, 1, 1),
}
cursor.execute(add_salary, data_salary)

# Make sure data is committed to the database
cnx.commit()

cursor.close()
cnx.close()

Aqui você vê claramente o fluxo de conexão com o banco de dados, criando um cursor, executando consultas, confirmando o resultado no banco de dados e, finalmente, limpando e fechando a conexão.

    
por vidarlo 20.04.2018 / 21:13
0

Sua instrução insert tenta inserir 3 valores (Date, Time, Temperature), mas você fornece apenas 2 (datetimeWrite, temp). Não pode funcionar. Além disso, como indicado por vidarlo, você realmente deve investigar erros. Basta colocar a declaração impressa indicada na referência pode ajudá-lo muito:

...
except mysql.connector.Error as err:
  print("Something went wrong: {}".format(err))
...
    
por Marc Vanhoomissen 24.04.2018 / 21:33