请考虑以下示例:
with open('a.txt') as f:
pass
# Is f supposed to be defined here?
Run Code Online (Sandbox Code Playgroud)
我已经阅读了with语句和PEP-343的语言文档(2.7),但据我所知,他们在这个问题上没有说什么.
在CPython 2.6.5 f中似乎确实在with-block之外定义,但我宁愿不依赖可能改变的实现细节.
我正在做一个教程并遇到一种方法来处理与sqlite3的连接,然后我研究了关键字并发现它是一个替代尝试,除了,最后的做事方式
有人说,在文件处理的情况下,'WITH'会自动处理文件关闭,我认为与zetcode教程中所说的连接类似: -
"使用with关键字,Python解释器会自动释放资源.它还提供错误处理." http://zetcode.com/db/sqlitepythontutorial/
所以我认为使用这种处理方式会很好,但我无法弄清楚为什么两个(内部范围和外部范围)语句都有效?不应该WITH释放连接?
import sqlite3
con = sqlite3.connect('test.db')
with con:
cur = con.cursor()
cur.execute('SELECT 1,SQLITE_VERSION()')
data = cur.fetchone()
print data
cur.execute('SELECT 2,SQLITE_VERSION()')
data = cur.fetchone()
print data
Run Code Online (Sandbox Code Playgroud)
哪个输出
(1, u'3.6.21')
(2, u'3.6.21')
Run Code Online (Sandbox Code Playgroud)
我不知道WITH在这里做了什么(或者一般情况下),所以,如果你愿意,请详细说明在这种情况下使用WITH over TRY CATCH.
是否应该在每次查询时打开和关闭连接?(我在一个函数内部构造查询,我每次都用一个参数调用)这是一个好习惯吗?
我有时会偶然遇到:
OperationalError:数据库已锁定
在更新SQLite数据库的过程中,但是我发现很难重现该错误:
SELECT在此处和那里执行一些只读查询(等),但是没有提交问题:是否有办法在发生此错误时记录哪个其他进程ID负责锁定?
更一般而言,如何调试OperationalError: database is locked?
我在SQLite3和Python 3上做错了.也许我误解了SQLite数据库的概念,但我希望,即使在关闭应用程序之后,数据也会存储在数据库中?当我插入数据并重新打开应用程序时,插入消失,数据库为空.
这是我的小数据库:
import sqlite3
def createTable():
conn.execute('''CREATE TABLE VideoFile
(ID INTEGER PRIMARY KEY NULL,
FileName TEXT NOT NULL,
FilePath TEXT NOT NULL,
numOfFrames INT NOT NULL,
FPS INT NOT NULL,
Tags TEXT NOT NULL,
Voting REAL);''')
def insert():
conn.execute("INSERT INTO VideoFile (Filename, FilePath, numOfFrames,FPS, Tags, Voting) \
VALUES ('ARCAM_0010_100', 'Categories/Dirt/Small', 2340, 50, 'Bock', 1 )");
conn.execute("INSERT INTO VideoFile (Filename, FilePath, numOfFrames,FPS, Tags, Voting) \
VALUES ('ARCAM_0010_100', 'Categories/Dirt/Small', 2340, 50, 'Bock', 1 )");
def printAll(cursor):
cursor …Run Code Online (Sandbox Code Playgroud) 我想编写一个Python模块来抽象出我的应用程序的数据库事务.我的问题是我是否需要打电话connect()和close()每笔交易?在代码中:
import sqlite3
# Can I put connect() here?
conn = sqlite3.connect('db.py')
def insert(args):
# Or should I put it here?
conn = sqlite3.connect('db.py')
# Perform the transaction.
c = conn.cursor()
c.execute(''' insert args ''')
conn.commit()
# Do I close the connection here?
conn.close()
# Or can I close the connection whenever the application restarts (ideally, very rarely)
conn.close()
Run Code Online (Sandbox Code Playgroud)
我对数据库的经验不多,所以我很欣赏为什么一种方法优于另一种方法的解释.