gpt4 book ai didi

python - MySQL 中存储过程链式调用的有趣行为

转载 作者:行者123 更新时间:2023-11-29 21:04:43 26 4
gpt4 key购买 nike

我正在使用 MySQL 5.5、Python 2.6 和 MySQLdb 包

我有:

程序#1

DROP PROCEDURE IF EXISTS log_create;

DELIMITER $$
CREATE PROCEDURE log_create
(
IN p_log_type_id INT,
IN p_body TEXT
)
BEGIN
INSERT INTO log(
log_type_id,
body
)
VALUES(
p_log_type_id,
p_body
);
SELECT LAST_INSERT_ID() as log_id;
END $$
DELIMITER ;

程序#2

DROP PROCEDURE IF EXISTS http_request_log_create;

DELIMITER $$
CREATE PROCEDURE http_request_log_create
(
IN p_log_type_id INT,
IN p_body TEXT,
IN p_host VARCHAR(255),
IN p_port SMALLINT UNSIGNED,
IN p_url VARCHAR(1024),
IN p_method VARCHAR(8),
IN p_customer_id VARCHAR(128),
IN p_protocol VARCHAR(8),
IN p_query_parameters VARCHAR(1024),
IN p_duration DECIMAL(3,3) UNSIGNED
)
BEGIN
CALL log_create(p_log_type_id, p_body);
SET @v_log_id = LAST_INSERT_ID();
INSERT INTO http_request_log (
log_id,
host,
port,
url,
method,
customer_id,
protocol,
query_parameters,
duration
)
VALUES (
@v_log_id,
p_host,
p_port,
p_url,
p_method,
p_customer_id,
p_protocol,
p_query_parameters,
p_duration
);
SELECT LAST_INSERT_ID() as http_request_log_id;
END $$
DELIMITER ;

程序#3:

DROP PROCEDURE IF EXISTS api_error_log_create;

DELIMITER $$
CREATE PROCEDURE api_error_log_create
(
IN p_log_type_id INT,
IN p_body TEXT,
IN p_host VARCHAR(255),
IN p_port SMALLINT UNSIGNED,
IN p_url VARCHAR(1024),
IN p_method VARCHAR(8),
IN p_customer_id VARCHAR(128),
IN p_protocol VARCHAR(8),
IN p_query_parameters VARCHAR(1024),
IN p_duration DECIMAL(3,3) UNSIGNED,
IN p_message VARCHAR(512),
IN p_stack_trace TEXT,
IN p_version VARCHAR(8)
)
BEGIN
CALL http_request_log_create(p_log_type_id, p_body, p_host, p_port, p_url, p_method, p_customer_id, p_protocol, p_query_parameters, p_duration);
INSERT INTO api_error_log (
http_request_log_id,
message,
stack_trace,
version
)
VALUES (
LAST_INSERT_ID(),
p_message,
p_stack_trace,
p_version
);

SELECT LAST_INSERT_ID() as api_error_log_id;
END $$
DELIMITER ;

正如您所看到的,我正在使用存储过程调用链,这对我来说效果很好。但是...

def create_api_error_log(self, connection, model):
result = self.create_record(
connection,
'api_error_log_create',
(model.log_type_id,
model.body,
model.host,
model.port,
model.url,
model.method,
model.customer_id,
model.protocol,
model.query_parameters,
model.duration,
model.message,
model.stack_trace,
model.version,
model.api_error_log_id))
return ApiErrorLogCreateResult(result)

这里,结果变量包含字典: {'log_id':_some_int_}

log_idLOG_ID!!!,不需要api_error_log_id

据我了解,光标返回作为存储过程调用中第一个 select 语句结果的结果。

我需要从函数调用返回的api_error_log_id值进行更正。我知道如何通过其他几种方式获取它,但我需要知道是否可以通过我的方式获取所需的 id?

编辑 1:

def create_record(self, conn, proc_name, proc_params):
result = self.common_record(conn, proc_name, proc_params, 'fetchone')
return result and result.itervalues().next()

def common_record(self, conn, proc_name, proc_params=(), result_func='', method='callproc'):
cursor = conn.cursor()
eval('cursor.%s' % method)(proc_name, proc_params)
result = result_func and eval('cursor.%s' % result_func)() or cursor.rowcount > 0
cursor.close()
#print 'sql: ', proc_name, proc_params
return result

最佳答案

嗯,解决方案非常简单。

上次查询(存储过程调用的链接)期间 select 语句的所有结果集均可用于阅读。默认情况下,游标包含可用于获取的第一个选择结果。您可以使用

cursor.nextset()

检查是否有任何其他选择结果。此方法返回 True 或 False。如果为 True,则可以使用 fetch 方法获取下一个 select 语句的结果。

干杯。

关于python - MySQL 中存储过程链式调用的有趣行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36914863/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com