Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python中上下文管理器之前或之后的循环_Python_Sqlite_Loops_Contextmanager - Fatal编程技术网

python中上下文管理器之前或之后的循环

python中上下文管理器之前或之后的循环,python,sqlite,loops,contextmanager,Python,Sqlite,Loops,Contextmanager,我在stackoverflow上搜索,找不到任何相关的标题。 假设在python中,我想连接到数据库并执行一些查询。哪一个是最好的方法。是在循环内用语句声明还是在循环外用语句声明?它通常也适用于处理文件。为了更清晰,请参见以下2种变体 此外,我还想知道找到try和except语句的更好方法,应该是在启动上下文管理器之前还是之后(正如我在下面所做的) 循环前带有语句 def wr_to_db(db_file): query_switch = 'insert into switches va

我在stackoverflow上搜索,找不到任何相关的标题。 假设在python中,我想连接到数据库并执行一些查询。哪一个是最好的方法。是在循环内用语句声明还是在循环外用语句声明?它通常也适用于处理文件。为了更清晰,请参见以下2种变体

此外,我还想知道找到try和except语句的更好方法,应该是在启动上下文管理器之前还是之后(正如我在下面所做的)

循环前带有语句

def wr_to_db(db_file):
    query_switch = 'insert into switches values (?, ?)'
    with sqlite3.connect(db_file) as conn:
        for data in read_switch_data():
            try:
                conn.execute(query_switch, data)
            except sqlite3.IntegrityError as e:
                print('Error occured: ', e)
def wr_to_db(db_file):
    query_switch = 'insert into switches values (?, ?)'
    for data in read_switch_data():
        with sqlite3.connect(db_file) as conn:
            try:
                conn.execute(query_switch, data)
            except sqlite3.IntegrityError as e:
                print('Error occured: ', e)
循环后带有语句

def wr_to_db(db_file):
    query_switch = 'insert into switches values (?, ?)'
    with sqlite3.connect(db_file) as conn:
        for data in read_switch_data():
            try:
                conn.execute(query_switch, data)
            except sqlite3.IntegrityError as e:
                print('Error occured: ', e)
def wr_to_db(db_file):
    query_switch = 'insert into switches values (?, ?)'
    for data in read_switch_data():
        with sqlite3.connect(db_file) as conn:
            try:
                conn.execute(query_switch, data)
            except sqlite3.IntegrityError as e:
                print('Error occured: ', e)
(我很惊讶没有人回答这个问题……)
我认为您的第一个示例非常准确:您希望您的
with()
语句位于
for
循环之外。带有上下文管理器的
非常有用,因为当您退出该块时,它会自动清理资源(关闭打开的文件,或关闭/刷新建立的数据库连接)。因此,如果您使用第二种方法,并将上下文管理器放在for循环中,那么您将连接到db并关闭并清理每个循环中的连接。这是非常低效的

此外,您还询问了try/except块。类似地,您希望上下文管理器围绕整个块。但是相对于for循环将它们放置在何处取决于在异常情况下希望发生什么。以这两种情况为例(我们假设每种情况都有一个db连接):

vs

在第一种情况下,如果在执行一条语句时发生错误,它将打印一条错误,然后继续尝试下一条语句。在第二种情况下,如果在中引发异常,则它将打印错误并退出整个循环,并且不再尝试执行任何
命令。因此,位置取决于您希望它的行为方式


希望对你有帮助,编码快乐

谢谢你回答山姆,你说得很清楚。