在Python程序中使用SQLite

cry*_*ice 14 python sqlite exception

我创建了一个Python模块,用于创建和填充多个SQLite表.现在,我想在一个程序中使用它,但我真的不知道如何正确调用它.我发现的所有教程基本上都是"内联",即他们以线性方式使用SQLite,而不是如何在生产中实际使用它.

我正在尝试做的是检查方法是否已经创建了数据库.如果是这样,那么我可以使用它.如果没有,则引发异常,程序将创建数据库.(或者使用if/else语句,以较好者为准).

我创建了一个测试脚本,看看我的逻辑是否正确,但它不起作用.当我创建try语句时,它只是创建一个新数据库,而不是检查是否已存在.下次运行脚本时,即使我尝试捕获异常,也会收到表已存在的错误.(我之前没有使用过try/except,但认为这是学习的好时机).

是否有任何关于在操作上使用SQLite的好教程或有关如何编写代码的任何建议?我查看了pysqlite教程和我找到的其他人,但他们没有解决这个问题.

S.L*_*ott 29

不要让它比它需要的更复杂.大型独立数据库具有复杂的设置和配置要求.SQLite只是一个用SQL访问的文件,它更简单.

请执行下列操作.

  1. 在数据库中为"组件"或"版本"或"配置"或"发布"或类似管理的内容添加一个表.

    CREATE TABLE REVISION(RELEASE_NUMBER CHAR(20));

  2. 在您的应用程序中,正常连接到您的数据库.

  3. 对修订表执行简单查询.这是可能发生的事情.
    • 查询无法执行:您的数据库不存在,因此执行一系列CREATE语句来构建它.
    • 查询成功但不返回任何行或版本号低于预期:您的数据库存在,但已过期.您需要从该版本迁移到当前版本.希望您有一系列DROP,CREATE和ALTER语句来执行此操作.
    • 查询成功,版本号是预期值.不做任何事,您的数据库配置正确.


dic*_*ciu 13

AFAIK和SQLITE数据库只是一个文件.要检查数据库是否存在,请检查文件是否存在.

当您打开SQLITE数据库时,如果备份它的文件不到位,它将自动创建一个.

如果您尝试将文件作为不是数据库的sqlite3数据库打开,您将得到:

"sqlite3.DatabaseError:文件已加密或不是数据库"

所以检查文件是否存在,并确保在文件不是sqlite3数据库的情况下尝试捕获异常

  • 文件不是具有预期模式的正确SQLite数据库的可能性很小.我建议你除了检查文件存在外还要进行查询. (7认同)

pdc*_*pdc 7

SQLite会在您第一次尝试使用它时自动创建数据库文件.用于创建表的SQL语句可用于IF NOT EXISTS使命令仅在未创建表时生效这种方式您不需要事先检查数据库的存在:SQLite可以为您处理.

我仍然担心的主要问题是执行CREATE TABLE IF EXISTS每个Web事务(比如说)都是低效的; 你可以通过让程序保存一个(内存中)变量来说明它是否已经创建了数据库,因此它可以避免这种情况,因此CREATE TABLE每次运行都会运行一次脚本.这仍然允许您删除数据库并在调试期间重新开始.


gim*_*mel 5

正如@diciu指出的那样,数据库文件将由sqlite3.connect创建.如果您想在文件不存在时采取特殊操作,则必须明确检查是否存在:

import os
import sqlite3
if not os.path.exists(mydb_path):
    #create new DB, create table stocks
    con = sqlite3.connect(mydb_path)
    con.execute('''create table stocks
      (date text, trans text, symbol text, qty real, price real)''')
else:
    #use existing DB
    con = sqlite3.connect(mydb_path)
...
Run Code Online (Sandbox Code Playgroud)