0

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

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

首先我创建连接:

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

最后我想在表中插入新值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()-function 并完成我通过控制台插入了第二个手动条目。

完成该过程后,表格如下所示:

MariaDB 表

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

4

2 回答 2

1

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

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

get_cur()调用get_conn,获取它一个新的连接,检索一个属于它的游标对象,并返回它。

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

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

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

于 2021-12-28T11:38:47.430 回答
0

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

这种事情发生了,不必惊慌。

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

于 2021-12-28T11:13:33.963 回答