Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 来自sqlalchemy的存储过程调用未提交_Python_Mysql_Sqlalchemy - Fatal编程技术网

Python 来自sqlalchemy的存储过程调用未提交

Python 来自sqlalchemy的存储过程调用未提交,python,mysql,sqlalchemy,Python,Mysql,Sqlalchemy,我已经在MySQL中测试了我的SP,它运行良好。我可以用它插入新条目。我试着用炼金术从烧瓶中调用它,它确实运行了,但是insert并没有进入表中,尽管它似乎执行了正确的命令 我的SP检查是否存在条目如果是,则返回0,如果否,则插入条目并返回1。当我从后端发送一个新查询时,返回值为1,但表中没有插入,当我发送相同的查询时,返回值仍然为1。当我发送该表保存的现有查询时,返回值为0 我还有其他路由使用相同的db.connect(),它确实可以获取信息。我阅读了其他关于使用相同的execute函数调用S

我已经在MySQL中测试了我的SP,它运行良好。我可以用它插入新条目。我试着用炼金术从烧瓶中调用它,它确实运行了,但是insert并没有进入表中,尽管它似乎执行了正确的命令

我的SP检查是否存在条目如果是,则返回0,如果否,则插入条目并返回1。当我从后端发送一个新查询时,返回值为1,但表中没有插入,当我发送相同的查询时,返回值仍然为1。当我发送该表保存的现有查询时,返回值为0

我还有其他路由使用相同的
db.connect()
,它确实可以获取信息。我阅读了其他关于使用相同的
execute
函数调用SP来运行原始sql的文章。从单据上看,
execute
似乎不需要额外的
commit
命令来确认交易

为什么我不能从flask服务器插入

这是后端函数

def add_book(info):
    try:
        connection = db.connect()
        title = info['bookTitle']
        url = info['bookUrl']
        isbn = info['isbn']
        author = info['author']
        #print("title: " + title + " url: "+ url + " isbn: "+ str(isbn) + " author"+ str(author))
        query = 'CALL add_book("{}", "{}", {}, {});'.format(title, url, isbn, author)
        #print(query)
        query_results = connection.execute(query)
        connection.close()
        query_results = [x for x in query_results]
        result = query_results[0][0]
    except Exception as err:
        print(type(err))
        print(err.args)
    return result
这是要插入的表

CREATE TABLE `book` (
  `isbn` int(11) DEFAULT NULL,
  `review_count` int(11) DEFAULT NULL,
  `language_code` varchar(10) DEFAULT NULL,
  `avg_rating` int(11) DEFAULT NULL,
  `description_text` text,
  `formt` varchar(30) DEFAULT NULL,
  `link` varchar(200) DEFAULT NULL,
  `authors` int(11) DEFAULT NULL,
  `publisher` varchar(30) DEFAULT NULL,
  `num_pages` int(11) DEFAULT NULL,
  `publication_month` int(11) DEFAULT NULL,
  `publication_year` int(11) DEFAULT NULL,
  `url` varchar(200) DEFAULT NULL,
  `image_url` varchar(200) DEFAULT NULL,
  `book_id` int(11) NOT NULL AUTO_INCREMENT,
  `ratings_count` int(11) DEFAULT NULL,
  `work_id` int(11) DEFAULT NULL,
  `title` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
  PRIMARY KEY (`book_id`),
  KEY `authors` (`authors`),
  CONSTRAINT `book_ibfk_2` FOREIGN KEY (`authors`) REFERENCES `author` (`author_id`) ON DELETE RESTRICT ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=36485537 DEFAULT CHARSET=utf8;
这是SP

DELIMITER $$
CREATE DEFINER=`root`@`%` PROCEDURE `add_book`(
        IN titleIn VARCHAR(200), urlIn VARCHAR(200), isbnIn INT, authorIn INT)
BEGIN
DECLARE addSucess INT;

DECLARE EXIT HANDLER FOR sqlexception
BEGIN
    GET diagnostics CONDITION 1
    @p1 = returned_sqlstate, @p2 = message_text;
    SELECT @pa1, @p2;
ROLLBACK;
END;

DECLARE exit handler for sqlwarning
BEGIN
GET DIAGNOSTICS CONDITION 1
@p1 = RETURNED_SQLSTATE, @p2 = MESSAGE_TEXT;
SELECT @p1 as RETURNED_SQLSTATE  , @p2 as MESSAGE_TEXT;
ROLLBACK;
END;

    IF EXISTS (SELECT 1 FROM book WHERE title = titleIn) THEN
        SET addSucess = 0;
    ELSE 
        INSERT INTO book (authors, title, url, book_id)
            VALUES (authorIn, titleIn, urlIn, null);
        SET addSucess = 1;
    END IF;
    SELECT addSucess;
END$$
DELIMITER ;
show授予当前用户的我的用户权限

[('GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, RELOAD, SHUTDOWN, PROCESS, REFERENCES, INDEX, ALTER, SHOW DATABASES, CREATE TEMPORARY TABLES, LOC ... (73 characters truncated) ... OW VIEW, CREATE ROUTINE, ALTER ROUTINE, CREATE USER, EVENT, TRIGGER, CREATE TABLESPACE, CREATE ROLE, DROP ROLE ON *.* TO `root`@`%` WITH GRANT OPTION',), ('GRANT APPLICATION_PASSWORD_ADMIN,CONNECTION_ADMIN,ROLE_ADMIN,SET_USER_ID,XA_RECOVER_ADMIN ON *.* TO `root`@`%` WITH GRANT OPTION',), ('REVOKE INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER, CREATE TEMPORARY TABLES, LOCK TABLES, CREATE VIEW, CREATE ROUTINE, ALTER ROUTINE ON `mysql`.* FROM `root`@`%`',), ('REVOKE INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER, CREATE TEMPORARY TABLES, LOCK TABLES, CREATE VIEW, CREATE ROUTINE, ALTER ROUTINE ON `sys`.* FROM `root`@`%`',), ('GRANT INSERT ON `mysql`.`general_log` TO `root`@`%`',), ('GRANT INSERT ON `mysql`.`slow_log` TO `root`@`%`',), ('GRANT `cloudsqlsuperuser`@`%` TO `root`@`%`',)]

我用
会话
api解决了这个问题。如果有人正在阅读,请告诉我传递参数和解析返回结果的更好方法

def add_book(info):
    title = info['bookTitle']
    url = info['bookUrl']
    isbn = info['isbn']
    author = info['author']
    with Session(db) as session:
        session.begin()
        try:
            query = 'CALL insert_book("{}", "{}", {}, {});'.format(title, url, isbn, author)
            result = session.execute(text(query)).all()
        except:
            session.rollback()
            raise
        else:
            session.commit()

要确保的一件事是您的用户有权执行存储过程。有几次绊倒了我。@p谢谢,我正在使用
root
访问,我只是再次限制了我的访问权限。这些答案可能会对您有所帮助。如果没有,请将问题包括您正在使用的连接器及其版本。使用字符串格式将参数传递给SQL查询是个坏主意。@IljaEverilä谢谢,我正在努力让自己更熟悉api,我将寻找更好的方法绑定参数。
query=“CALL insert_book(:p1,:p2,:p3,:p4);“
params={“p1”:title,“p2”:url,“p3”:isbn,“p4”:author}
result=session.execute(text(query),params).all()