pymysql как передать параметры для хранимой процедуры - PullRequest
0 голосов
/ 19 сентября 2018

Я пытаюсь использовать CSV в качестве источника данных и вызвать хранимую процедуру из базы данных MySQL для заполнения БД.В настоящее время я получаю исключение: произошло исключение: (1318, «Неверное количество аргументов для PROCEDURE mydb.update_servers; ожидается 3, получено 0»)

import pymysql
#import myconnutils
import datetime
import xlrd
import re
import os
import csv



#open csv file
with open('DBstatus.csv') as csvfile:
    reader = csv.DictReader(csvfile)
    for row in reader:
        print(row['Host Name'], row["OS Type"], row['Host Description'])





#create database connection

databaseConnection = pymysql.connect(host='localhost', user='xxx', password='xxx', db='mydb', cursorclass= pymysql.cursors.DictCursor)

try:
    cursorObject = databaseConnection.cursor()
    # parms = (row['Host Name'], row["OS Type"], row['Host Description'])

    # resultArgs = cursor.callproc('update_servers', inOutParams)
    cursorObject.execute("call update_servers")

    for result in cursorObject.fetchall():
        print(result)
except Exception as e:
    print("exception occured: {}".format (e))

finally:
    databaseConnection.close()

Хранимая процедура:

CREATE DEFINER=`root`@`%` PROCEDURE `update_servers`(
    IN p_name varchar(100),
    IN p_software_name varchar(100),
    IN p_description varchar(250)
    )
BEGIN   


        INSERT INTO servers (name, software_name, description) 
        VALUES (p_name, p_software_name, 
        p_description);
        SELECT LAST_INSERT_ID() into @recordId;




    SET @retVal = CAST(@recordId AS UNSIGNED);
    SELECT @retVal;  
END

1 Ответ

0 голосов
/ 24 сентября 2018

Вы не передаете никакие параметры своей процедуре, даже если она ожидает три параметра (p_name, p_software_name и p_description), следовательно, ошибка.try:

params = row['Host Name'], row["OS Type"], row['Host Description']
cursorObject.execute("call update_servers(?, ?, ?)", params)

Хотя я бы порекомендовал использовать официальный MySQL-коннектор , который имеет специальный регистр курсора для хранимых процедур, поскольку вы уже закомментировали его -MySQLCursor.callproc()

...