我有一个postgres数据库在RDS。当我从本地连接它并通过sqlalchemy插入它时,我可以看到更新的结果,但是当我从Lambda运行相同的代码时,执行显示为完成(即代码正确运行),但结果未在DB中更新。在相同的代码中,当我打印出' SELECT * table_name*的结果时,我可以看到新的行添加,但是当我从本地(使用pgadmin和通过代码)检查该行是否真的添加了,它是缺失的。
我观察到的一个奇怪的事情是,我有一个列'ID',这是一个主键。当我从lambda添加ID为25的行,然后从local添加另一行时,从local添加的行被分配为第27行(而不是26,这被分配给从lambda添加的行,但是我看不到ID为26的行)。
下面是我的代码:
from sqlalchemy import create_engine, MetaData, Table, Column, Integer, String, text
engine = create_engine("postgresql://%s:%s@%s:%s/%s" % (username, password, host, port, database))
conn = engine.connect()
print("CONNECTED TO RDS")
query = 'select * from predictions'
result = conn.execute(text(query)).fetchall()
print("THE QUERY RESULT IS", 'n', result)
upload_query = "INSERT INTO predictions (image_url, image_class) VALUES ('LOCAL_ADD', 'LOCAL_ADD');"
conn.execute(text(upload_query))
query = 'select * from predictions'
result = conn.execute(text(query)).fetchall()
print("THE QUERY RESULT IS", 'n', result)
conn.close()
我的lambda没有VPC。然而,我的RDS数据库有4个安全组,其中两个是入站/出站规则设置为'所有流量'与'0.0.0.0'
在Lambda函数中启用自动提交或显式COMMIT
事务
序列值在请求下一个值时更新。这发生在事务之外。它可以被看作发生在一个独立的事务中。这是必要的,以便并发事务可以使用序列,而不会引入等待或死锁。
您已经使用conn.execute执行了更改,但是如果在lambda会话中没有设置autocommit,那么这些更改将不会发布到数据库,直到您使用conn.commit提交它们。所以像这样添加conn.commit()
行:
conn.execute(text(upload_query))
conn.commit()