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