我想將給定的值從我的 docker app-service 插入到 MariaDB-service。
連接已經建立,因為我可以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()- 函式,最后通過控制臺插入了第二個手動條目。
程式完成后,表格如下所示:

請注意,ìd在 AUTO_INCREMENT 上。所以這個函式write_data()沒有被完全跳過,因為第二個手動條目的 id 是 3 而不是 2。
uj5u.com熱心網友回復:
您在與游標所屬的連接不同的連接中提交事務。
get_conn() 創建一個新的資料庫連接并回傳它。
get_cur()呼叫get_conn,它會獲得一個新連接,檢索屬于它的游標物件,然后回傳它。
在您的主代碼中,您呼叫get_conn- 為您提供連接 A。然后您通過呼叫獲得一個游標get_cur- 創建一個連接 B 并回傳一個屬于它的游標。
您execute在游標物件(連接 B)上運行,但提交在第一次呼叫中獲得的連接(連接 A)。
PS:這是一個非常有趣的除錯問題,謝謝:)
uj5u.com熱心網友回復:
在帶有新代碼的新表中,在沒有 COMMIT 的情況下無意中執行 INSERT 真的很容易。使用不使用自動提交的 Python 連接器尤其如此。與打開事務的斷開連接會回滾事務。并且,回滾的 INSERT 不會釋放自動增加的 ID 值以供重用。
這種事情發生了,也不必驚慌。
一個聰明的資料庫程式員不會依賴一組沒有間隙的自動遞增 ID。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/396735.html
