需要检查和填充 sqlite 数据库管理和操作代码

2023-12-26

All,

更新:根据谷歌结果和答案,我添加了更多提示,但仍未完成。

在使用sqlite3和研究sqlalchemy的过程中,我发现有必要编写下面的代码来管理数据,但是,对我来说在sqlalchemy中做到这一点可能是一个困难的部分,然后我又回到sqlite3模块。

下面的代码列出了另外 10 个步骤作为内务工作,其中大部分来自 WEB,我怀疑有专业知识的人可以检查并填补缺失的部分。 如果有人知道如何在 SQLAlchemy 中做到这一点,您也可以分享一下吗?

1. 测试数据库文件是否存在

import sqlite3 
import os 
database_name = "newdb.db" 
if not os.path.isfile(database_name): 
    print "the database already exist" 

# connect to to db, refer #2
db_connection = sqlite3.connect(database_name) 
db_cursor = db_connection.cursor() 

2.测试数据库文件是否是有效的sqlite3格式

    http://stackoverflow.com/questions/1516508/sqlite3-in-python


    >>> c.execute("SELECT * FROM tbl") 
    Traceback (most recent call last): 
      File "<stdin>", line 1, in <module> 
    sqlite3.DatabaseError: file is encrypted or is not a database
    =========sqlalchemy way ===============
    http://www.mail-archive.com/[email protected] /cdn-cgi/l/email-protection/msg20860.html
    import os, os.path as osp
try:
    from pysqlite2 import dbapi2 as sqlite
except:
    import sqlite3 as sqlite

def isSQLite(filename):
    """True if filename is a SQLite database
    File is database if: (1) file exists, (2) length is non-zero,
                        (3) can connect, (4) has sqlite_master table
    """
    # validate file exists
    if not osp.isfile(filename):
        return False
    # is not an empty file
    if not os.stat(filename).st_size:
        return False
    # can open a connection
    try:
        conn = sqlite.connect(filename)
    except:
        return False
    # has sqlite_master
    try:
        result = conn.execute('pragma table_info(sqlite_master)').fetchall()
        if len(result) == 0:
            conn.close()
            return False
    except:
        conn.close()
        return False

    # looks like a good database
    conn.close()
    return True 

3.检查表是否存在

c=conn.cursor() 
if table_name in [row for row in c.execute("SELECT name FROM sqlite_master WHERE type='table' AND name='table_name';")]

4.备份磁盘中的数据库文件

http://stuvel.eu/archive/55/safely-copy-a-sqlite-database
import shutil, os, sqlite3
if not os.path.isdir ( backupdir ):
    raise Exception 
backupfile = os.path.join ( backupdir, os.path.basename(dbfile) + time.strftime(".%Y%m%d-%H%M") )
db = sqlite3.connect ( dbfile )
cur = db.cursor ()
cur.execute ( 'begin immediate' )
shutil.copyfile ( dbfile, backupfile )
cur.execute ( 'rollback' )
=========or========
http://github.com/husio/python-sqlite3-backup
=========or========
http://docs.python.org/release/2.6/library/sqlite3.html#sqlite3.Connection.iterdump

5. 备份表 - 在同一个数据库文件中

   c=conn.cursor() 
   c.execute("CREATE TABLE demo_backup AS SELECT * FROM demo;") 

6. 重命名表

c.execute("ALTER TABLE foo RENAME TO bar;")

7. 将表复制到不同的数据库/从不同的数据库复制表:

Thanks, MPelletier

Connect to one database 
db_connection = sqlite3.connect(database_file) 
Attach the second database
db_connection.execute("ATTACH database_file2 AS database_name2")
Insert from one to the other:
db_connection.execute("INSERT INTO FooTable SELECT * FROM database_name2.FooTable")
==========or============
db_connection.execute("INSERT INTO database_name2.FooTable SELECT * FROM FooTable")

    ========sqlalchemy way======
    http://www.mail-archive.com/[email protected] /cdn-cgi/l/email-protection/msg11563.html
      def duplicateToDisk(self, file):
    '''Tohle ulozi databazi, ktera byla pouze v pameti, na disk'''
    cur = self.connection()
    import os
    if os.path.exists(file):
      os.remove(file)
    cur.execute("attach %s as extern" % file)

    self.checkTable('extern.dictionary')
    cur.execute("insert into extern.dictionary select * from dictionary")
    cur.execute("detach extern")
    self.commit()

8 测试数据库是否被锁定?

 #possible?
 try:
    c = sqlite.connect(database_name, timeout=0)  
    c.commit() 
 except OperationalError               # OperationalError: database is locked  

9. 连接数据库超时,等待其他调用者释放锁

c = sqlite.connect(database_name, timeout=30.0)  # default 5sec

10 强制所有数据库连接释放/提交 A.K.A 释放所有锁?

   refer #12

11. python中使用sqlite的多线程:

http://code.activestate.com/recipes/526618/
http://www.yeraze.com/2009/01/python-sqlite-multiple-threads/

12 从 SQLAlchemy 获取 conn?

   #from FAQ
    #try to reuse the connection pool from SQLAlchemy
    engine = create_engine(...)
    conn = engine.connect()              #****1
    conn.connection.<do DBAPI things>
    cursor = conn.connection.cursor(<DBAPI specific arguments..>)
    ===or ==== can out of pool's manage
    conn = engine.connect()
    conn.detach()  # detaches the DBAPI connection from the connection pool
    conn.connection.<go nuts>
    conn.close()  # connection is closed for real, the pool replaces it with a new connect

    ========and not sure if this works ===========
#from sqlalchemy document                #http://www.sqlalchemy.org/docs/reference/sqlalchemy/pooling.html?highlight=connection%20pool
import sqlalchemy.pool as pool
import sqlite3 as sqlite3

conn_proxy = pool.manage(sqlite3)
# then connect normally
connection = conn_proxy.connect(...)


=====================================================================
    #****1  : what is #****1 on above code invoked                  =_=!!
    A engine.raw_connection()
    =
    A pool.unique_connection()
    =
    A _ConnectionFairy(self).checkout()
    =
    A return _ConnectionFairy <== cls
    =   _connection_record.get_connection()
    =            _ConnectionRecord.connection
    =                return a pool.creator **which is a callable function that returns a DB-API connection object**

谢谢你的时间!

Rgs, KC


要将数据复制到不同的数据库或从不同的数据库复制数据,一般的 SQLite 方法是:

  1. 连接到一个数据库

    db_connection = sqlite3.connect(database_file) 
    
  2. 附加第二个数据库

    db_connection.execute("ATTACH database_file2 AS database_name2")
    
  3. 从一个插入到另一个:

    db_connection.execute("INSERT INTO FooTable SELECT * FROM database_name2.FooTable")
    

    or

    db_connection.execute("INSERT INTO database_name2.FooTable SELECT * FROM FooTable")
    
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

需要检查和填充 sqlite 数据库管理和操作代码 的相关文章

随机推荐

  • OpenJDK有类似jstack(Oracle Java)的工具吗?

    jstack是jdk自带的一个线程栈分析工具 我可以使用此命令来查看或导出 Java 应用程序中的线程堆栈信息 OpenJDK有类似jstack Oracle Java 的工具吗 以下是 openjdk 中列出的工具 http openjd
  • 无法使用node.js中的javascript删除Windows中的文件

    我有以下代码尝试删除 Windows 7 计算机上的文件 check if this item has an uploaded image file var imageFullPathName dirname public images r
  • 继承父div到子div的所有css属性

    My html div div div div CSS 看起来像 parent height 100px width 200px any aother property1 something any aother property2 som
  • Xquery:相同的测试无论是在 switch/case 还是在 if/then/else 中都有不同的结果

    我找不到以下内容的解释 我制作了这个测试脚本来解决我之前的问题 https stackoverflow com questions 48190450 xquery not working case expression in a switc
  • 将参数传递给函数内的函数

    我正在编写的函数涉及来自基本 R 的其他函数以及很多参数 例如 实际函数要长得多 myfunction lt function dataframe Colv NA matrix lt as matrix dataframe out lt h
  • 在 componentDidMount 上调度一个动作(react/redux)

    我是react redux 的相对论新手 我想问一个 也许是哲学 问题 是否可以在以下位置调度操作 例如触发 api 调用 componentDidMount一个反应组件 如果不是 我应该在哪里发送该操作以及为什么 如果是 那么就没有其他问
  • 检查该组是否有 NaN 值

    我有一个数据框 我想groupby by bq market id然后检查是否有NaN值在bq back price在每组中如果是那么True每组如果没有则False每组 bq selection id bq balance bq mark
  • 将 ImageIcon 的大小调整为 JButton [重复]

    这个问题在这里已经有答案了 您好 如何使图像图标的大小适合 JButton 我想将图像图标的大小调整为按钮的大小 JFrame frame2 new JFrame Tauler Joc JPanel panell new JPanel Im
  • C# 如何获取两个日期之间的日期

    我想获取两个日期之间的日期 而不是预期的9不同的日期 我得到875287 and 内存不足 下面的代码会出现什么问题 StartDate值为01 04 2016 00 00 00 EndDate值为10 04 2016 00 00 00 v
  • Eclipse 编辑器的只读属性视图

    我正在创建一个在文本编辑器中具有树视图的编辑器 我附加了一个属性视图 以便在选择每个树项目时显示该项目的属性 为此 每个树项都是一个实现 IPropertySource 的类 因此 属性值是通过重写 IPropertySource 类的方法
  • 如何观察 Laravel 5.1 中实现接口的所有模型?

    我有一个审计课程 它扩展了雄辩模型 class Audit extends Model 我有一个可审核的界面 interface IAuditiable public function audit 我有一个特征 可以实现接口并定义模型和审计
  • WPF MVVM - 简单登录应用程序

    我正在继续学习 WPF 目前专注于 MVVM 并使用 Karl Shifflett 的 MVVM In a Box 教程 但是有一个关于在视图 视图模型之间共享数据以及它如何更新屏幕上的视图的问题 附注我还没有讨论过IOC 下面是测试应用程
  • 垂直滑块,其中填充条根据所选值的大小改变颜色

    我已经看过了 泰勒里克滑块 http demos telerik com aspnet mvc Slider theme vista ajax库滑块 http www asp net ajaxlibrary AjaxControlToolk
  • Joda-Money 通过休眠进行持久化

    有一个 JodaTime 库提供 Hibernate 持久性 http www joda org joda time hibernate 最近我开始看乔达 莫尼 http www joda org joda money 并开始了解如何使用休
  • 不带 Order By 子句的 SQL Select 语句的顺序

    据我所知 从关系数据库理论来看 select没有一个声明order by子句应被视为没有特定的顺序 但实际上在 SQL Server 和 Oracle 中 我已经在这两个平台上进行了测试 如果我从没有order by多次使用子句 我总是以相
  • 将 Sprite 对象数组合并为一个 Sprite - Unity

    我在 Unity 中有一系列 Sprite 对象 它们的大小根据加载的图像而变化 我想将它们像平铺地图一样并排组合成一张图像 我希望它们的布局就像您正在形成一行图像一样 一个接一个 注意 不是一个在另一个之上 我怎样才能做到这一点 我之所以
  • 如何在reStructuredText中定义csv表的高度?

    我使用此代码从 csv 创建一个表 用于 readthedocs 中的文档 csv table Markram et al Model Network configuration file file config files Markram
  • 如何在 EntityFramework 中计算行而不加载内容?

    我正在尝试确定如何count使用 EntityFramework 匹配表中的行 问题是每行可能有很多兆字节的数据 在二进制字段中 当然 SQL 会是这样的 SELECT COUNT FROM MyTable WHERE fkID 1 我可以
  • Laravel Backpack 中带有列的过滤表

    我有一个员工表 显示如下 id name code 1 Employee 1 A1 2 Employee 2 A2 我想在此表中按代码列创建一个过滤器 我的查询将是这样的 SELECT name FROM employee WHERE co
  • 需要检查和填充 sqlite 数据库管理和操作代码

    All 更新 根据谷歌结果和答案 我添加了更多提示 但仍未完成 在使用sqlite3和研究sqlalchemy的过程中 我发现有必要编写下面的代码来管理数据 但是 对我来说在sqlalchemy中做到这一点可能是一个困难的部分 然后我又回到