我的设置:
(1)和(2)是网络上的不同机器。 python脚本生成必须存储在MySQL数据库中的数据。
我使用这个(example-)代码来实现:
def function sqldata(date,result):
con = mdb.connect('sql.lan', 'demouser', 'demo', 'demo')
with con:
cur = con.cursor()
cur.execute('INSERT INTO tabel(titel, nummer) VALUES( %s, %s)',(date, result))
scipt生成一个数据点。每一分钟。所以这意味着每分钟都会打开和关闭一个新连接。我想知道在脚本开始时打开连接是否更好,只在脚本终止时关闭它。有效地使连接无限期地打开。
这显然引发了如何处理/恢复SQL服务器"离开"网络(例如由于重启)一段时间。
键入我的问题this question时出现在"类似问题"部分。然而,从2008年开始,可能已经过时了,收到的4个答案似乎相互矛盾。
目前这方面的见解是什么?
答案 0 :(得分:1)
所提到的答案是正确的,但也许没有回答你的所有问题。我不能在这里为你提供一个完整的运行python脚本,但让我解释一下我将如何使用它:
规则1:通常,大多数mysql函数都会返回值,您应该始终检查,以便您可以对不需要的行为做出反应。
规则2:在脚本开头打开连接,并在整个脚本中使用此唯一连接。
显然,您可以检查sqldata函数中是否存在现有连接,如果没有,则可以向全局con对象打开一个新连接。
if not con:
con = mdb.connect('sql.lan', 'demouser', 'demo', 'demo')
如果已经存在连接,您可以通过执行具有固定预期结果的简单查询来检查它是“up status”,您可以检查sql服务器是否正在运行。
if con:
cur = con.cursor()
returned = cur.execute('SELECT COUNT(*) FROM tabel')
if returned.with_rows:
....
基本上你可以避免这种情况,因为如果你没有得到光标,并且在使用它之前先检查它,那么你已经知道服务器是否存活。
所以检查,检查和检查。您应该检查从函数中返回的所有内容,以便进行良好的错误处理。只使用连接或使用游标而不先检查它,可能会导致您与NIL对象通话并导致脚本崩溃。
我可以给你的最后一个 BIG HINT 是使用多行插入。如果只是将逗号分隔的值添加到插入字符串中,则实际上可以插入数百行:
# consider result would be filled like this
result = '("First Song",1),("Second Song",2),("Third Song",3)'
# then this will insert 3 rows with one call
returned = cur.execute('INSERT INTO tabel (titel, nummer) VALUES %s',(date, result), multi=True)
# since literally it will execute
returned = cur.execute('INSERT INTO tabel (titel, nummer) VALUES ("First Song",1),("Second Song",2),("Third Song",3)', multi=True)
# and now you can check returned for any error
if returned:
....