【发布时间】:2018-12-12 21:07:47
【问题描述】:
我正在测试一个数据库,其中我有 3 个表,数字 1 存储用户信息,数字 2 存储不同城市的纬度和经度,还有一个存储用户位置和距离的第三个表最近的城市。第三个表具有来自其他两个表的主键的复合键。 我在 mysql 工作台中编写了一个存储过程,它接受 5 个变量,然后将数据插入到第三个表中,这是使用一些随机变量的代码:
SET @lat55 = 36.8451995849609;
SET @lng55 = 54.428798675537;
SET @city55 = 'Rasht';
SET @state55 = 'Gilan';
SET @user_id55 = 70440675;
DELIMITER //
DROP PROCEDURE IF EXISTS do1 //
CREATE PROCEDURE do1 (IN id INT, IN state VARCHAR(25), IN city VARCHAR(25),
IN lat DECIMAL(15,13),IN lng DECIMAL(15,12))
BEGIN
` `DECLARE dmini DECIMAL(5,1);
DECLARE lmini INT;
SELECT location_id, ST_Distance_Sphere(POINT(lng,lat), geopoint)/1000 AS
distance INTO lmini, dmini FROM locations ORDER BY distance ASC LIMIT 1;
INSERT INTO user_has_loc (user_id, location_id, distance, state, city,
lat, lng) VALUES (id, lmini, dmini, state, city, lat, lng);
END;
//
CALL do1(@user_id55,@state55,@city55,@lat55,@lng55);
它工作得很好并插入到表中,但是当我尝试使用来自 python 的相同变量调用相同的过程时,它什么也不做:
try:
mydb = mysql.connector.connect(
host="localhost",
user="root",
password="123456",
database="v21")
c = mydb.cursor()
lat = 36.8451995849609
lng = 54.428798675537
city = "Rasht"
state = "Gilan"
user = 70440675
arg = (user, state, city, lat, lng)
c.callproc('do1', arg)
except mysql.connector.Error as err:
print("Something went wrong: {}".format(err))
当我使用它时
c.execute("CALL do1({},{},{},{},{})".format(user, state, city, lat, lng))
它给出了另一个错误,说“'字段列表'中的未知列'Gilan'”。有趣的是,如果我手动将相同的数据插入到表中,那么当我尝试从 python 调用该过程时,它会引发错误:“重复条目 '70440675-883' for key 'PRIMARY'”。所以它似乎试图插入到表中,但它没有保存它! 有人可以告诉我我在这里做错了什么吗?
【问题讨论】:
-
我没有使用 MySQL 的经验,但真的应该有一个变量
@pt1没有在其他任何地方引用吗? -
我从我正在研究的早期版本中复制了上面的代码,应该是@pointt,我会在我的问题中编辑它,谢谢
标签: python mysql mysql-python