Py学习  »  Python

mysql python connector没有给出任何错误,但是值没有插入到数据库中?

Kurt Peek • 4 年前 • 849 次点击  

我正在leetcode上练习SQL(例如, https://leetcode.com/problems/game-play-analysis-ii/ )并希望在本地复制失败的测试用例。leetcode为JSON提供了每个测试用例的表值,我希望将这些测试用例以编程方式转换为 INSERT INTO 声明。

我创造了一个 Activity2 mydatabase 有四列, player_id , device_id , event_date games_played :

mysql> DESCRIBE Activity2;
+--------------+---------+------+-----+---------+-------+
| Field        | Type    | Null | Key | Default | Extra |
+--------------+---------+------+-----+---------+-------+
| player_id    | int(11) | YES  |     | NULL    |       |
| device_id    | int(11) | YES  |     | NULL    |       |
| event_date   | date    | YES  |     | NULL    |       |
| games_played | int(11) | YES  |     | NULL    |       |
+--------------+---------+------+-----+---------+-------+
4 rows in set (0.00 sec)

mysql> SELECT * FROM Activity2;
Empty set (0.00 sec)

mysql> SELECT DATABASE();
+------------+
| DATABASE() |
+------------+
| mydatabase |
+------------+
1 row in set (0.00 sec)

然后我尝试运行以下脚本(运行之后 pip install mysql-connector-python ):

import json
import mysql.connector

connection = mysql.connector.connect(
    user='myuser',
    password='mypassword',
    host='127.0.0.1',
    database='mydatabase',
    port=3306)

cursor = connection.cursor()

with open('game_play_analysis_testcase.json') as fp:
    data = json.load(fp)

for player_id, device_id, event_date, games_played in data['rows']['Activity']:
    query = \
f"""
INSERT INTO Activity2 (player_id, device_id, event_date, games_played)
VALUES ({player_id}, {device_id}, {event_date!r}, {games_played});
"""
    print(query)
    try:
        cursor.execute(query)
    except mysql.connector.Error as err:
        print(err.msg)

cursor.close()
connection.close()

JSON文件的结构是这样的:例如, print 语句生成以下(部分)输出:

INSERT INTO Activity2 (player_id, device_id, event_date, games_played)
VALUES (85, 99, '2019-02-27', 45);


INSERT INTO Activity2 (player_id, device_id, event_date, games_played)
VALUES (78, 34, '2019-01-16', 87);


INSERT INTO Activity2 (player_id, device_id, event_date, games_played)
VALUES (58, 31, '2019-02-25', 52);

问题是如果我运行这个脚本,我会发现 活动2 之后桌子还是空的。

我认为由于没有错误被提出/打印,这应该是有效的。我确信我使用的凭证是正确的。知道为什么这不起作用吗?

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/38654
 
849 次点击  
文章 [ 2 ]  |  最新文章 4 年前
Michael
Reply   •   1 楼
Michael    4 年前

如果不了解更多关于数据库的信息,我不能确定这是正确的,但很可能您只需要提交结果。请参见此处: https://dev.mysql.com/doc/connector-python/en/connector-python-api-mysqlconnection-commit.html

mysql.connector的默认行为是 自动提交,因此如果数据库是事务性的,则需要执行 connection.commit() 在您关闭连接之前。或者你可以在每次 cursor.execute 如果您想确保在那个时候提交这些事务。

Bobby Durrett
Reply   •   2 楼
Bobby Durrett    4 年前

插入后可能需要提交。此链接表示mysql python连接器不会自动提交。

https://dev.mysql.com/doc/connector-python/en/connector-python-api-mysqlconnection-commit.html

可以在for循环之后使用inserts执行connection.commit()。