首页 > 解决方案 > Python Mysql 调用静默失败(MariaDB)

问题描述

试图弄清楚 Mysql Insert 语句期间发生了什么。我有一个正在编写的实用程序,正在尝试打开我的数据库(Mysql 中的 Django 数据库)并将另一个数据库中的记录添加到其中。我想我包含了它需要的所有字段,如果我真的剪切并粘贴了生成的插入语句 - 它可以工作。
但是,它不能以编程方式工作。它似乎不会产生错误。最后一个插入行似乎表明成功,但实际记录永远不会到达那里(我认为它出于某种原因正在回滚)。只是看不出问题是什么。在此之前,我成功地使用相同的游标检查了同一个数据库中的其他内容,所以游标应该是好的。

下面是python中的插入代码。

create_string = """Insert INTO trackx_site_program 
                        SET air_date = '%s',
                            air_time = '%s',
                            service = '%s',
                            block_time = '%s',
                            block_time_delta = %d,
                            running_time = '%s',
                            running_time_delta = %d,
                            remaining_time = '%s',
                            remaining_time_delta = %d,
                            title = '%s',
                            locked_flag = %d,
                            deleted_flag = %d,
                            library = '%s',
                            mc = '%s',
                            producer = '%s',
                            editor = '%s',
                            remarks = '%s',
                            audit_time = '%s',
                            audit_user = 'todd' """ % (
                        air_date, air_time, service_name, block_time, block_time_delta,
                        running_time, running_time_delta, remaining_time, remaining_time_delta,
                        title, locked_flag, deleted_flag, library, mc, producer, editor,
                        remarks, audit_time)
                    print(" Create String = \n %s" % create_string)                  
                    num_rows = new_trackx_cursor.execute(create_string)
                    print ("Num_rows from execute = %s" % num_rows)
                    new_program_id = new_trackx_cursor.lastrowid
                    print("Last Row ID Inserted was %s " % new_program_id)
                    new_trackx_cursor.close()
                    sys.exit("Exiting after insert")

字符串示例如下:

 Create String = 
 Insert INTO trackx_site_program 
                        SET air_date = '2001-06-13',
                            air_time = '18:00:00',
                            service = 'TheService',
                            block_time = '0:57:00',
                            block_time_delta = 3420000000,
                            running_time = '00:00:00',
                            running_time_delta = 0,
                            remaining_time = '0:57:00',
                            remaining_time_delta = 3420000000,
                            title = 'My061301',
                            locked_flag = 1,
                            deleted_flag = 0,
                            library = 'K061301-PM',
                            mc = 'ToddS',
                            producer = 'TheProducer',
                            editor = 'theEditor',
                            remarks = 'REGULAR PROGRAM',
                            audit_time = '2001-06-13 10:55:16',
                            audit_user = 'toadyb' 
Num_rows from execute = 1
Last Row ID Inserted was 22 
Exiting after insert

实际数据库表如下所示:

desc tracks_site_program;
+----------------------+--------------+------+-----+---------+----------------+
| Field                | Type         | Null | Key | Default | Extra          |
+----------------------+--------------+------+-----+---------+----------------+
| id                   | int(11)      | NO   | PRI | NULL    | auto_increment |
| air_date             | date         | NO   |     | NULL    |                |
| air_time             | time(6)      | NO   |     | NULL    |                |
| service              | varchar(10)  | NO   |     | NULL    |                |
| block_time           | time(6)      | NO   |     | NULL    |                |
| block_time_delta     | bigint(20)   | NO   |     | NULL    |                |
| running_time         | time(6)      | NO   |     | NULL    |                |
| running_time_delta   | bigint(20)   | NO   |     | NULL    |                |
| remaining_time       | time(6)      | NO   |     | NULL    |                |
| remaining_time_delta | bigint(20)   | NO   |     | NULL    |                |
| title                | varchar(190) | NO   |     | NULL    |                |
| locked_flag          | tinyint(1)   | NO   |     | NULL    |                |
| locked_expiration    | datetime(6)  | YES  |     | NULL    |                |
| deleted_flag         | tinyint(1)   | NO   |     | NULL    |                |
| library              | varchar(190) | YES  |     | NULL    |                |
| mc                   | varchar(64)  | NO   |     | NULL    |                |
| producer             | varchar(64)  | NO   |     | NULL    |                |
| editor               | varchar(64)  | NO   |     | NULL    |                |
| remarks              | longtext     | YES  |     | NULL    |                |
| audit_time           | datetime(6)  | NO   |     | NULL    |                |
| audit_user           | varchar(32)  | YES  |     | NULL    |                |
+----------------------+--------------+------+-----+---------+----------------+
21 rows in set (0.00 sec)

如您所见,我打印出实际的字符串,如果我剪切并粘贴到 mysql 会话中,它就可以正常工作。

有人知道这里给出了什么吗?我缺少一个步骤吗?谢谢

标签: pythonmysqldjangomariadb

解决方案


不太清楚为什么,但我在 Python 中的连接都以 autocommit=0 (False) 开头,所以我的事务自动回滚。插入后我对数据库连接句柄进行了提交,事务成功完成。


推荐阅读