向MySQL数据库添加数据的首选方法

时间:2015-09-12 13:57:53

标签: python mysql

我的设置:

  1. MySQL服务器。
  2. 主机运行python脚本。
  3. (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个答案似乎相互矛盾。

    目前这方面的见解是什么?

1 个答案:

答案 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:
    ....