python sqlite3 是不是有表

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python sqlite3 是不是有表相关的知识,希望对你有一定的参考价值。

表 是 数据库必不可少的一部分,sqlite3当然有啦

创建表的方法

直接用sql语言

CREATE TABLE database_name.table_name(
   column1 datatype  PRIMARY KEY(one or more columns),
   column2 datatype,
   column3 datatype,
   .....
   columnN datatype,
);

 使用python的接口

import sqlite3
conn = sqlite3.connect('test.db')
cursor = conn.cursor()
cursor.execute('create table user (id varchar(20) primary key, name varchar(20))')

参考技术A 有啊,sqlite3也必须创建数据库才可以操作,不过它的数据库是一个文件,其它的与mysql之类的没啥区别。

1.导入Python SQLITE数据库模块
Python2.5之后,内置了SQLite3,成为了内置模块,这给我们省了安装的功夫,只需导入即可
import sqlite3

2. 创建/打开数据库

在调用connect函数的时候,指定库名称,如果指定的数据库存在就直接打开这个数据库,如果不存在就新创建一个再打开。

cx = sqlite3.connect("E:/test.db")
也可以创建数据库在内存中。
con = sqlite3.connect(":memory:")

3.数据库连接对象
打开数据库时返回的对象cx就是一个数据库连接对象,它可以有以下操作:
commit()--事务提交

rollback()--事务回滚
close()--关闭一个数据库连接
cursor()--创建一个游标

关于commit(),如果isolation_level隔离级别默认,那么每次对数据库的操作,都需要使用该命令,你也可以设置isolation_level=None,这样就变为自动提交模式。

4.使用游标查询数据库

我们需要使用游标对象SQL语句查询数据库,获得查询对象。 通过以下方法来定义一个游标。

cu=cx.cursor()

游标对象有以下的操作:
execute()--执行sql语句
executemany--执行多条sql语句
close()--关闭游标
fetchone()--从结果中取一条记录,并将游标指向下一条记录
fetchmany()--从结果中取多条记录
fetchall()--从结果中取出所有记录
scroll()--游标滚动

1. 建表
cu.execute("create table catalog (id integer primary key,pid integer,name varchar(10) UNIQUE,nickname text NULL)")

上面语句创建了一个叫catalog的表,它有一个主键id,一个pid,和一个name,name是不可以重复的,以及一个nickname默认为NULL。

2. 插入数据

请注意避免以下写法:

# Never do this -- insecure 会导致注入攻击

pid=200
c.execute("... where pid = '%s'" % pid)
正确的做法如下,如果t只是单个数值,也要采用t=(n,)的形式,因为元组是不可变的。

for t in[(0,10,'abc','Yu'),(1,20,'cba','Xu')]:
cx.execute("insert into catalog values (?,?,?,?)", t)
简单的插入两行数据,不过需要提醒的是,只有提交了之后,才能生效.我们使用数据库连接对象cx来进行提交commit和回滚rollback操作.

cx.commit()

3.查询
cu.execute("select * from catalog")

要提取查询到的数据,使用游标的fetch函数,如:

In [10]: cu.fetchall()
Out[10]: [(0, 10, u'abc', u'Yu'), (1, 20, u'cba', u'Xu')]
如果我们使用cu.fetchone(),则首先返回列表中的第一项,再次使用,则返回第二项,依次下去.

4.修改
In [12]: cu.execute("update catalog set name='Boy' where id = 0")
In [13]: cx.commit()
注意,修改数据以后提交

5.删除

cu.execute("delete from catalog where id = 1")
cx.commit()

如果解决了您的问题请采纳!
如果未解决请继续追问!

在带有 sqlite 的 Python 中是不是有必要关闭游标?

【中文标题】在带有 sqlite 的 Python 中是不是有必要关闭游标?【英文标题】:In Python with sqlite is it necessary to close a cursor?在带有 sqlite 的 Python 中是否有必要关闭游标? 【发布时间】:2011-01-20 18:46:02 【问题描述】:

这里是场景。在您的函数中,您正在使用游标执行语句,但其中一个失败并引发异常。您的程序在关闭它正在使用的光标之前退出函数。光标会飘来飘去占用空间吗?我必须关闭光标吗?

此外,Python 文档有一个游标使用示例,并说:“如果我们完成了游标,我们也可以关闭它。”关键字是“可以”,而不是“必须”。这究竟是什么意思?

【问题讨论】:

【参考方案1】:

这可能是一个好主意(虽然它可能与 sqlite 无关,不知道那里,但它会让你的代码更具可移植性)。此外,使用最近的 Python (2.5+),这很容易:

from __future__ import with_statement
from contextlib import closing

with closing(db.cursor()) as cursor:
    # do some stuff

【讨论】:

【参考方案2】:

您不必在光标上调用close();它可以像任何其他对象一样被垃圾收集。

但是,即使等待垃圾回收听起来不错,我认为确保数据库游标等资源无论是否出现异常都被关闭仍然是一种不错的方式。

【讨论】:

【参考方案3】:

有趣的是,Python 3.0 doc 说“如果我们完成了光标,我们也可以关闭它”,而 Python 2.7 和 3.6 文档说“我们也可以关闭 连接如果我们完成了它”。

Python 2.7 和 3.0-3.4 文档没有描述游标 .close() 方法。但是 Python 3.5 和 3.6 文档描述了 cursor .close() 方法:

立即关闭光标(而不是在每次调用 __del__ 时)。

从现在开始,光标将无法使用;如果尝试对游标进行任何操作,将引发ProgrammingError 异常。

【讨论】:

【参考方案4】:

全部,

我在使用 sqlite3 的代码 (Python 3.8) 中遇到了逐渐的内存泄漏。我将可能的原因追溯到我的数据库类。事实证明,我会打开并使用游标,但从不关闭它。数据库在程序(Windows 服务)的生命周期内保持打开状态,并在退出时关闭。

一旦我开始关闭所有使用游标的数据库操作中的游标,我的内存泄漏就停止了,并且内存占用变得稳定。

因此,我建议您花时间关闭光标。它使代码更加一致,显然有助于控制内存消耗。

以下是我如何关闭光标的示例:

def write_to_db(self, cache_item:CacheEntry):
        '''Write a single cache entry to the database'''
        crsr = self._db_con.cursor()

        # Load some data elements
        fax_line_path = cache_item._dir_part
        phone_line = cache_item._phone_line
        sub_folder = cache_item._subfolder
        fname = cache_item._fname
        work_done = cache_item.get_workdone()

        try:
            crsr.execute(FilenameCacheDB.INSERT_CACHE,
                             (fax_line_path, 
                              phone_line, 
                              sub_folder, 
                              fname, 
                              work_done))

        except Exception as e:
            LOG.warning(f"Could not write cache_item to db because e")
            raise e

        finally:
            #
            # I was *not* closing the cursor prior
            #
            crsr.close()
            self._db_con.commit()

【讨论】:

【参考方案5】:

我还没有看到sqlite3.Cursor.close() 操作的任何效果。

关闭后,您仍然可以调用fetch(all|one|many),它将返回上一个执行语句的剩余结果。即使运行Cursor.execute() 仍然有效...

【讨论】:

我注意到了同样的行为(我编写了一个测试以确保光标已关闭,但它失败了),并想知道这是 python 连接器问题还是 sqlite3 固有的问题。【参考方案6】:

此代码将自动关闭Cursor。它还会自动关闭并提交Connection

import sqlite3
import contextlib

def execute_statement(statement):
    with contextlib.closing(sqlite3.connect(path_to_file)) as conn: # auto-closes
        with conn: # auto-commits
            with contextlib.closing(conn.cursor()) as cursor: # auto-closes
                cursor.execute(statement)

【讨论】:

为什么我不能只使用with con.cursor() as cursor: ...?那会更容易阅读..这段代码感觉有点像用java编程..嗯/shrug【参考方案7】:

看代码sn-p和***user2010和Peer给出的思路,使用Python contextmanager优雅地处理游标更容易。

from contextlib import contextmanager

@contextmanager
def OpenCursor(conn):
    cursor = conn.cursor()
    try:    
        yield (cursor)
    except Exception as e:  
        cursor.close()  
        raise e
    else:                     
        cursor.close() 

在没有 OpenCursor 的情况下使用:

def get(conn, key, default=None):
    cursor = conn.cursor()
    cursor.execute(f'SELECT value FROM table WHERE key=?', (key,))
    row = cursor.fetchone()
    if row:
        return (True)
    else:
        return (default)

使用 OpenCursor 作为上下文管理器:

def get(conn, key, default=None):
    with OpenCursor(conn) as cursor:
        cursor.execute(f'SELECT value FROM table WHERE key=?', (key,))
        row = cursor.fetchone()
        if row:
            return (True)
        else:
            return (default)

【讨论】:

以上是关于python sqlite3 是不是有表的主要内容,如果未能解决你的问题,请参考以下文章

Sqlit--学习教程(建立数据库表)

python 如何访问加密的sqlite3数据库?

从 sqlite3 迁移到 CoreData?

sqlite3中的数据类型

Python中应用SQL及SQLAlchemy

sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) unable to open database file