MariaDB - 插入值不影响任何行

MariaDB - Inserting Values doesn't affect any rows

我想将给定值从我的 docker 应用程序服务插入到 MariaDB 服务。

连接已经建立,因为我可以通过MariaDB.connection.cursor执行SELECT * FROM

首先我创建连接:

def get_conn() -> mariadb.connection:
    try:
        conn = mariadb.connect(
            user="XXX",
            database="XXX",
            password="XXX",
            host="db",
            port=33030,
        )
    except mariadb.Error as e:
        print(f'Error connecting to MariaDB Platform: {e}')
        sys.exit(1)

    return conn

然后我创建一个 mariadb.connection.cursor-Object:

def get_cur() -> mariadb.connection.cursor:
    conn = get_conn()
    cur = conn.cursor()
    return cur

最后我想在 table testing:

中插入新值
def write_data():
    cursor = get_cur()
    conn = get_conn()

    cursor.execute('INSERT INTO testing (title) VALUE ("2nd automatic entry");')
    print("Executed Query")
    conn.commit()
    cursor.close()
    conn.close()
    print("Closed Connection")

    return True

为了测试是否插入了条目,我从 1 个手动条目开始,然后执行 write_data()-函数,最后我通过控制台插入了第二个手动条目。

程序完成后 table 看起来像:

请注意 ìd 在 AUTO_INCREMENT 上。所以函数 write_data() 没有被完全跳过,因为第二个手动输入得到的 id 是 3 而不是 2.

在带有新代码的新 table 中,很容易无意中执行没有 COMMIT 的 INSERT。使用不使用自动提交的 Python 连接器尤其如此。与打开的事务断开的连接会回滚该事务。并且,回滚的 INSERT 不会释放自动递增的 ID 值以供重用。

这种事发生了,不必惊慌

明智的数据库程序员不会依赖一组没有间隙的自动递增 ID。

您正在与您的光标所属的连接不同的连接中提交事务。

get_conn() 创建一个新的数据库连接并 returns 它。

get_cur() 调用 get_conn,获取新连接,检索属于它的游标对象,然后 returns 它。

在您的主要代码中,您调用 get_conn - 这为您提供了连接 A。 然后你通过调用 get_cur 获得一个游标 - 它创建一个连接 B 和 returns 一个属于它的游标。

您 运行 execute 在游标对象(连接 B)上,但提交您在第一次调用(连接 A)中获得的连接。

PS:这是一个非常有趣的调试问题,谢谢 :)