salut je fais le python mysql dans ce projet, j'initialise la base de données et essaie de créer l'enregistrement de la table, mais il semble ne pas pouvoir charger les données dans la table, quelqu'un ici peut-il m'aider avec ce
import mysql.connector
mydb = mysql.connector.connect( host="localhost",user="root",password="asd619248636",database="mydatabase")
mycursor = mydb.cursor()
mycursor.excute=("CREATE TABLE record (temperature FLOAT(20) , humidity FLOAT(20))")
sql = "INSERT INTO record (temperature,humidity) VALUES (%d, %d)"
val = (2.3,4.5)
mycursor.execute(sql,val)
mydb.commit()
print(mycursor.rowcount, "record inserted.")
3 Réponses :
La modification de ce qui suit devrait résoudre votre problème:
sql = "INSERT INTO record (temperature,humidity) VALUES (%s, %s)"
val = ("2.3","4.5") # You can also use (2.3, 4.5)
mycursor.execute(sql,val)
L'API de base de données prend des chaînes comme arguments, et les convertit plus tard dans le type de données approprié. Votre code renvoie une erreur car il n'attend pas les types de données % d ou % f (int ou float).
Pour plus d'informations à ce sujet vous pouvez regarder ici
Pouvez-vous modifier pour expliquer pourquoi ce changement résout le problème? Vous n'enseignez rien à personne sans fournir des détails sur les raisons pour lesquelles ce changement est nécessaire.
@Jane, le val = (2.3, 4.5) en tant que flotteurs fonctionnera très bien. La bibliothèque utilisée ne prend en charge que % s ou % (name) s pour les espaces réservés de paramètre, le SQL doit donc utiliser % s . Voir mon commentaire ci-dessus.
@JustinEzequiel, je vais en prendre note dans une édition. Vous pouvez également les transmettre sous forme de chaînes.
changez simplement la méthode d'insertion en
sql = "INSERT INTO record (temperature,humidity) VALUES (%s, %s)"
alors cela fonctionne bien
Cela fonctionne pour moi.
# Insert from dataframe to table in SQL Server
import time
import pandas as pd
import pyodbc
# create timer
start_time = time.time()
from sqlalchemy import create_engine
df = pd.read_csv("C:\\your_path_here\\CSV1.csv")
conn_str = (
r'DRIVER={SQL Server Native Client 11.0};'
r'SERVER=Excel-Your_Server_Name;'
r'DATABASE=NORTHWND;'
r'Trusted_Connection=yes;'
)
cnxn = pyodbc.connect(conn_str)
cursor = cnxn.cursor()
for index,row in df.iterrows():
cursor.execute('INSERT INTO dbo.Table_1([Name],[Address],[Age],[Work]) values (?,?,?,?)',
row['Name'],
row['Address'],
row['Age'],
row['Work'])
cnxn.commit()
cursor.close()
cnxn.close()
Vous créez la table à chaque fois (ou essayez de le faire)? La table existe-t-elle déjà? Sinon, ce serait probablement là où il échoue.
Basé sur la documentation mysql ( pynative.com/python-mysql-insert -data-into-database-table ), vous devriez initialiser le curseur pour être une instruction préparée, comme
mycursor = mydb.cursor (prepare = True)L'enregistrement de table existe depuis que j'ai déjà vérifié par l'autre instruction, ce qui m'inquiète au sujet de l'erreur est peut-être la méthode d'insertion
J'essaierais
sql = "INSERT INTO record (température, humidité) VALEURS (% s,% s)"Depuis la documentation " Les paramètres trouvés dans les paramètres de tuple ou de dictionnaire sont liés aux variables de l'opération. Spécifiez les variables à l'aide du style de paramètre% s ou% (nom) s (c'est-à-dire en utilisant le style format ou pyformat). "
ouais cela fonctionne mais je ne comprends pas pourquoi je dois définir la valeur sous forme de chaîne, l'entrée doit être un nombre flottant
Je demanderais aux développeurs de la bibliothèque pourquoi. Oh et
% dest pour les entiers,% fest pour les flottants dans le formatage de chaîne python.