【问题标题】:Python Mysql call fails silently (MariaDB)Python Mysql 调用静默失败(MariaDB)
【发布时间】:2021-10-04 13:52:42
【问题描述】:

试图弄清楚在 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 会话中,它就可以正常工作。

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

【问题讨论】:

  • 如果您没有收到错误,并且找不到记录,则表明自动提交已关闭。您可以在 MariaDB 中启用常规日志并检查究竟发送到服务器的内容吗?
  • 很奇怪,连接是匿名的(而不是根),并且出于某种原因将自动提交设置为 0。有没有办法以编程方式强制它,或者我需要添加一个开始事务..?

标签: python mysql django mariadb


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-22
    • 1970-01-01
    • 2012-01-21
    • 2013-04-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多