21

我编写了一个 Python 脚本,如果它不存在,它会初始化一个空数据库。

import os

if not os.path.exists('Database'):
    os.makedirs('Database')
    os.system('sqlite3 Database/testDB.db ";"')

# rest of the script...

我可以以更 Pythonic 的方式使用 try-except 来执行此操作,还是可以接受这种代码?

4

4 回答 4

41

我认为你可以这样做:

import sqlite3
conn = sqlite3.connect('Database/testDB.db')

这应该连接到您的数据库并在它不存在的情况下创建它。我不确定这是最pythonic的方式,但它确实使用sqlite3模块而不是sqlite3命令。

于 2012-07-22T10:05:05.850 回答
6

使其成为 Pythonic:如果它不存在,则创建一个 sqlite3 数据库?

Pythonic的方法是使用上下文管理器:

import sqlite3

# if we error, we rollback automatically, else commit!
with sqlite3.connect('/Temp/testDB.db') as conn:
    cursor = conn.cursor()
    cursor.execute('SELECT SQLITE_VERSION()')
    data = cursor.fetchone()
    print('SQLite version:', data)

在 python shell 中,这对我来说是回声:

<sqlite3.Cursor object at 0x0CCAD4D0>
SQLite version: (u'3.5.9',)

为确保您拥有跨平台工作的临时文件路径,请使用tempfile.gettempdir

import tempfile
with sqlite3.connect(tempfile.gettempdir() + '/testDB.db') as conn:
    ...
于 2014-12-04T15:42:07.203 回答
6

创建目录路径、数据库文件和表

这是在必要时创建目录路径、数据库文件和表的方法。如果这些已经存在,脚本将不会覆盖任何内容,而只会使用手头的内容。

import os
import sqlite3

data_path = './really/deep/data/path/'
filename = 'whatever'

os.makedirs(data_path, exist_ok=True)

db = sqlite3.connect(data_path + filename + '.sqlite3')
db.execute('CREATE TABLE IF NOT EXISTS TableName (id INTEGER PRIMARY KEY, quantity INTEGER)')
db.close()
于 2017-07-18T12:04:51.800 回答
4

sqlite3.connect如果它不存在,将尝试创建一个数据库 - 所以判断一个数据库是否存在的唯一方法是尝试打开它并捕获一个IOError. 然后要创建一个空白数据库,只需使用该sqlite3模块进行连接。

import sqlite3

try:
    open('idonotexist')
    print 'Database already exists!'
except IOError as e:
    if e.args == 2: # No such file or directory
        blank_db = sqlite3.connect('idontexist')
        print 'Blank database created'
    else: # permission denied or something else?
        print e

当然,您可能仍然需要os.makedirs根据结构是否已经存在来做一些事情。

于 2012-07-22T10:10:28.943 回答