标签: sqlite

Python sqlite3和并发

我有一个使用"线程"模块的Python程序.每隔一秒,我的程序就会启动一个新的线程,从网络中获取一些数据,并将这些数据存储到我的硬盘中.我想使用sqlite3来存储这些结果,但我无法让它工作.问题似乎与以下几行有关:

conn = sqlite3.connect("mydatabase.db")
Run Code Online (Sandbox Code Playgroud)
  • 如果我将这行代码放在每个线程中,我会得到一个OperationalError,告诉我数据库文件已被锁定.我想这意味着另一个线程通过sqlite3连接打开了mydatabase.db并锁定了它.
  • 如果我将这行代码放在主程序中并将连接对象(conn)传递给每个线程,我会得到一个ProgrammingError,说在一个线程中创建的SQLite对象只能在同一个线程中使用.

以前我将所有结果存储在CSV文件中,并且没有任何这些文件锁定问题.希望这可以用sqlite实现.有任何想法吗?

python sqlite

79
推荐指数
6
解决办法
8万
查看次数

删除所有表命令

删除SQLite中所有表的命令是什么?

同样,我想删除所有索引.

sql database sqlite rdbms

79
推荐指数
5
解决办法
12万
查看次数

如何从Sqlite获取最新记录?

我有一张桌子question_table和一张桌子ImageButton(后面).单击Back后,我需要从数据库中获取最后插入的记录.

我行包括下面的列:question,optionA,optionB,optionC,optionD,和我需要的数据对我的使用Activity.我在数据库中创建了一个方法,但它不起作用.

这是代码供参考:

MySQLiteHelper.java提取:

public List<ObjectiveWiseQuestion> getLastInsertQuestion()
{
    // long index = 0;
    List<ObjectiveWiseQuestion>LocwiseProfileList=new ArrayList<ObjectiveWiseQuestion>();
    db = getReadableDatabase();
    Cursor cursor = db.query(
            "sqlite_sequence",
            new String[]{"seq"},
            "name = ?",
            new String[]{TABLE_QUESTION},
            null,
            null,
            null,
            null );

    if (cursor.moveToFirst())
    {
        do {
            ObjectiveWiseQuestion owq= new ObjectiveWiseQuestion();

            owq.setQuestion(cursor.getString(2));
            owq.setOptionA(cursor.getString(3));
            owq.setOptionB(cursor.getString(4));
            owq.setOptionC(cursor.getString(5));
            owq.setOptionD(cursor.getString(6));
            owq.setCorrectOption(cursor.getString(7));
            LocwiseProfileList.add(owq);
        } while(cursor.moveToNext());

        db.close();
    }

    return LocwiseProfileList;
}
Run Code Online (Sandbox Code Playgroud)

OnClickListner …

sqlite android

79
推荐指数
7
解决办法
13万
查看次数

在Python中使用unicode()和encode()函数

我有一个路径变量编码问题并将其插入SQLite数据库.我尝试使用编码("utf-8")功能解决它,这没有帮助.然后我使用了unicode()函数,它给了我unicode类型.

print type(path)                  # <type 'unicode'>
path = path.replace("one", "two") # <type 'str'>
path = path.encode("utf-8")       # <type 'str'> strange
path = unicode(path)              # <type 'unicode'>
Run Code Online (Sandbox Code Playgroud)

最后我获得了unicode类型,但是当路径变量的类型为str时,我仍然存在相同的错误

sqlite3.ProgrammingError:除非使用可解释8位字节串的text_factory(如text_factory = str),否则不得使用8位字节串.强烈建议您只需将应用程序切换为Unicode字符串.

你能帮我解决这个错误并解释正确的用法encode("utf-8")unicode()功能吗?我经常和它搏斗.

编辑:

这个execute()语句引发了错误:

cur.execute("update docs set path = :fullFilePath where path = :path", locals())
Run Code Online (Sandbox Code Playgroud)

我忘了改变遇到同样问题的fullFilePath变量的编码,但我现在很困惑.我应该只使用unicode()编码("utf-8")还是两者都使用?

我不能用

fullFilePath = unicode(fullFilePath.encode("utf-8"))
Run Code Online (Sandbox Code Playgroud)

因为它引发了这个错误:

UnicodeDecodeError:'ascii'编解码器无法解码位置32中的字节0xc5:序数不在范围内(128)

Python …

python sqlite string unicode encoding

79
推荐指数
2
解决办法
25万
查看次数

Android Room Persistence Library:Upsert

Android的Room持久性库慷慨地包含适用于对象或集合的@Insert和@Update注释.然而,我有一个用例(包含模型的推送通知)需要UPSERT,因为数据可能存在或可能不存在于数据库中.

Sqlite本身没有upsert,并且在这个SO问题中描述了变通方法.鉴于那里的解决方案,如何将它们应用于房间?

更具体地说,如何在Room中实现不会破坏任何外键约束的插入或更新?使用带onConflict = REPLACE的insert将导致onDelete调用该行的任何外键.在我的情况下,onDelete导致级联,重新插入行将导致其他表中的行与外键被删除.这不是预期的行为.

sqlite android android-room android-architecture-components

78
推荐指数
5
解决办法
4万
查看次数

Android数据库加密

Android使用SQLite数据库来存储数据,我需要加密SQLite数据库,怎么做呢?我知道应用程序数据是私有的.但是,我需要明确加密我的应用程序正在使用的SQLite数据库.

database sqlite encryption android

77
推荐指数
3
解决办法
8万
查看次数

ALTER TABLE添加列,如果不是SQLite中的EXISTS

我们最近需要在一些现有的SQLite数据库表中添加列.这可以通过以下方式完成ALTER TABLE ADD COLUMN.当然,如果表已被更改,我们希望不管它.不幸的是,SQLite不支持一个IF NOT EXISTS子句ALTER TABLE.

我们当前的解决方法是执行ALTER TABLE语句并忽略任何"重复列名"错误,就像这个Python示例(但在C++中).

然而,我们通常的做法来建立数据库模式是有含.SQL脚本CREATE TABLE IF NOT EXISTSCREATE INDEX IF NOT EXISTS语句,可以使用执行sqlite3_execsqlite3命令行工具.我们不能放入ALTER TABLE这些脚本文件,因为如果该语句失败,它之后的任何内容都不会被执行.

我希望将表定义放在一个地方,而不是在.sql和.cpp文件之间进行拆分.有没有办法ALTER TABLE ADD COLUMN IF NOT EXISTS在纯SQLite SQL中编写变通方法?

sqlite alter-table

77
推荐指数
6
解决办法
10万
查看次数

如何将新列添加到Android SQLite数据库?

我有Android SQLite数据库的一个问题.

我有一个表包含一个field.StudentFname和该应用程序与Android 2.3.1正常工作,现在如果我添加另一个字段,那么我的应用程序无法正常工作.

任何人都可以帮助我了解数据库的人,

database sqlite android

77
推荐指数
5
解决办法
8万
查看次数

如何在SQLite中不存在

我试图将此行从MS SQL Server移植到SQLite

IF NOT EXISTS(SELECT 1 FROM EVENTTYPE WHERE EventTypeName = 'ANI Received') 
    INSERT INTO EVENTTYPE (EventTypeName) VALUES ('ANI Received');
Run Code Online (Sandbox Code Playgroud)

似乎SQLite不支持IF NOT EXISTS或者至少我不能使它工作.我错过了一些简单的事吗?有解决方法吗?

sql sqlite

76
推荐指数
2
解决办法
13万
查看次数

为什么SQLAlchemy使用sqlite插入比直接使用sqlite3慢25倍?

为什么这个简单的测试用例使用SQLAlchemy插入100,000行比直接使用sqlite3驱动程序慢25倍?我在实际应用程序中看到了类似的减速.难道我做错了什么?

#!/usr/bin/env python
# Why is SQLAlchemy with SQLite so slow?
# Output from this program:
# SqlAlchemy: Total time for 100000 records 10.74 secs
# sqlite3:    Total time for 100000 records  0.40 secs


import time
import sqlite3

from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String,  create_engine 
from sqlalchemy.orm import scoped_session, sessionmaker

Base = declarative_base()
DBSession = scoped_session(sessionmaker())

class Customer(Base):
    __tablename__ = "customer"
    id = Column(Integer, primary_key=True)
    name = Column(String(255))

def init_sqlalchemy(dbname = 'sqlite:///sqlalchemy.db'):
    engine  = create_engine(dbname, echo=False) …
Run Code Online (Sandbox Code Playgroud)

python sqlite orm sqlalchemy

76
推荐指数
2
解决办法
3万
查看次数