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:这是一个非常有趣的调试问题,谢谢 :)
我想将给定值从我的 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:这是一个非常有趣的调试问题,谢谢 :)