这里的问题更多是关于如何组织检查给定表是否存在。有两个功能。首先将元素保存到数据库:
def save_in_db(macAddress, topic, payload):
conn = psycopg2.connect(dbname=DB_DATABASE,user= DB_USERNAME,password= DB_PASSWORD)
exist_table = table_exists(conn, "stat"+macAddress)
if exist_table == False:
create_table_enhet(conn, macAddress)
try:
cur = conn.cursor()
cur.execute("INSERT INTO stat" + macAddress + " (topic, message, ts) VALUES (%s,%s,%s)", (topic, payload ,datetime.now(),))
conn.commit()
cur.close()
conn.close()
except psycopg2.Error as e:
logger.error("save_in_db",e)
第二个,它检查是否存在并从第一个调用:
def table_exists(conn, table_name):
exists = False
try:
cur = conn.cursor()
cur.execute("select exists(select relname from pg_class where relname='" + table_name + "')")
exists = cur.fetchone()[0]
cur.close()
return exists
except psycopg2.Error as e:
logger.error ("table_exists", e)
有些情况会在connect
-entity 中产生冲突。也就是说,有时会发生错误
当前事务被中止,命令被忽略直到事务块结束
通过connect
-object 测试是否存在是否正确?还是在函数中table_exists()
创建自己的更好connect
,并在检查后关闭并创建一个新对象connect
以进行操作save_in_db()
?
错误:
通常发生在您尝试在同一数据库会话中发生错误后立即执行 SQL 命令时。更多细节在这里...
所以这个错误应该在
ROLLBACK
最后处理并完成。关于
conn
作为参数的传输——我会这样做,而不是每次都创建一个新的数据库会话——这太贵了。我还会稍微重写你的函数
table_exists()
:用法:
我将补充@MaxU 关于何时值得创建
connect
-entity 的答案,whencursor
。来自文档外的信息最佳实践cursor
,而不是根据需要创建一个新的?cursor
- 轻量级对象,大量创建它们不会造成任何问题。偏好是几乎总是创建一个新实体并在不再需要数据时立即删除旧实体。connect
,而不是根据需要创建一个新的?创建连接可能会很慢,因此最好创建一个连接并在必要时保持打开状态。
best practice
频繁回滚(@MaxU 提到的)也是如此rollback
,以确保后端永远不会停留在idle in transaction
. 事务打开和空闲时的状态。