标签: sqlite

使用SQLite的问题:内存:使用NHibernate

我使用NHibernate作为我的dataacess,有一段时间我并没有使用SQLite进行本地集成测试.我一直在使用文件,但我想我会把:memory:选项.当我启动任何集成测试时,似乎创建了数据库(NHibernate吐出表创建sql)但是与数据库交互会导致错误.

有没有人让NHibernate与内存数据库一起工作?它甚至可能吗?我正在使用的连接字符串是这样的:

Data Source=:memory:;Version=3;New=True
Run Code Online (Sandbox Code Playgroud)

c# sqlite nhibernate orm integration-testing

33
推荐指数
4
解决办法
2万
查看次数

强制Python放弃本机sqlite3并使用(已安装)最新的sqlite3版本

我试图摆脱的错误信息是:

AttributeError:'sqlite3.Connection'对象没有属性'enable_load_extension'

我有'easy_install'-ed最新的sqlite3版本和python以某种方式知道它存在,因为sqlite3.version_info产生3.6.13.在此版本中,Connection应具有"enable_load_extension"属性.

我认为正在进行的是python仍然使用本机sqlite3模块,我认为是2.4.1,因为sqlite3.version(iso sqlite3.version_info)产生2.4.1.

问题是如何强制python使用新的sqlite3模块进行所有sqlite3调用?

python sqlite

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

SQLite VARCHAR默认大小

在SQLite中,当我说:

CREATE TABLE my_table 
(
    my_column VARCHAR 
);
Run Code Online (Sandbox Code Playgroud)

如果没有指定VARCHAR大小,使用的默认大小是多少?

我似乎无法在sqlite.org找到它或从我的数据库文件中找到它.

我知道,SQLite不强制尝试的东西时,大小varchar(500)varchar(30),但有没有权衡在初始大小规格,什么是最好的做法?

sqlite

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

UNIQUE约束失败:sqlite数据库:android

我想在表中插入值.但是只插入了一个值.当我尝试插入新值时,我在log cat中收到错误.

日志猫显示:

abort at 13 in [INSERT INTO event(totalminutesfrom,dayofweek,title,location,totalminutesto,id) VALUES (?,?,?,?,?,?)]: UNIQUE constraint failed: event.id
01-24 11:34:39.764 7763-7763/com.example.siddhi.timetablelayout E/SQLiteDatabase: Error inserting totalminutesfrom=694 dayofweek=null title=qxs location=Eded & Mariz totalminutesto=0 id=0
01-24 11:34:39.764 7763-7763/com.example.siddhi.timetablelayout E/SQLiteDatabase: android.database.sqlite.SQLiteConstraintException: UNIQUE constraint failed: event.id (code 1555)
01-24 11:34:39.764 7763-7763/com.example.siddhi.timetablelayout E/SQLiteDatabase:     at android.database.sqlite.SQLiteConnection.nativeExecuteForLastInsertedRowId(Native Method)
01-24 11:34:39.764 7763-7763/com.example.siddhi.timetablelayout E/SQLiteDatabase:     at android.database.sqlite.SQLiteConnection.executeForLastInsertedRowId(SQLiteConnection.java:782)
01-24 11:34:39.764 7763-7763/com.example.siddhi.timetablelayout E/SQLiteDatabase:     at android.database.sqlite.SQLiteSession.executeForLastInsertedRowId(SQLiteSession.java:788)
01-24 11:34:39.764 7763-7763/com.example.siddhi.timetablelayout E/SQLiteDatabase:     at android.database.sqlite.SQLiteStatement.executeInsert(SQLiteStatement.java:86)
01-24 11:34:39.764 7763-7763/com.example.siddhi.timetablelayout E/SQLiteDatabase:     at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1471)
01-24 11:34:39.764 7763-7763/com.example.siddhi.timetablelayout E/SQLiteDatabase:     at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1341)
01-24 11:34:39.764 …
Run Code Online (Sandbox Code Playgroud)

java database sqlite android unique-constraint

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

如果值不为null,则更新数据库的SQL查询?

我有一张桌子,里面有大约17个田地.我需要在此表中执行频繁更新.但问题是每次我只更新几个字段.什么是在这种情况下编写查询以进行更新的最佳方法?我正在寻找一个选项,只有当它不为null时才会更新值.

例如,我在数据库Say A,B,C,D中有四个字段.用户更新说D的值.所有其他值保持不变.所以我想要一个更新查询,它只更新D的值,保持其他人不变.所以如果我把a,b和c作为null并且d与用户提供的值我想写一个更新查询,它只更新d的值为a,b和c为null.这是可以实现的吗?

我正在使用SQLite数据库.

有人可以请一些光吗?

sql database sqlite sql-update

32
推荐指数
1
解决办法
5万
查看次数

文件系统中目录的分层/树数据库

我想将存在于磁盘上的目录存储到数据库中,同时保持其层次结构/树结构.

这是一个无花果,

                         (ROOT)
                       /        \ 
                    Dir2        Dir3
                   /    \           \
                 Dir4   Dir5        Dir6
                 /          
               Dir7

我正在使用SQLite数据库.

  • 请建议我在SQLite数据库中存储上述结构的sql查询.

  • 和一个查询,以便在我选择一个目录时检索目录的完整路径.

即假设我选择Dir6然后我会得到像ROOT/Dir2/dir3/dir7这样的完整路径

sql sqlite tree path hierarchical-data

32
推荐指数
1
解决办法
1万
查看次数

Android SQLite - SQLiteDatabase.replace()实际上做了什么?

我需要对我的数据库执行INSERT或UPDATE IF EXIST类型的过程.我读到这.replace()是要走的路.它只是很好地插入新记录,但如果记录已经存在,它似乎不会更新它.

我有这样的事情:

ContentValues values = new ContentValues();
values.put(ID, 1);
values.put(NAME, "bob");
values.put(VISIBLE, true);
db.replace("peopleTable", null, values);
Run Code Online (Sandbox Code Playgroud)

如果我在此记录不在数据库中时运行此代码,它似乎创建记录就好了,就好像我做了一样insert().但是如果我将NAME更改为"john"或类似的东西,并replace()再次运行,它似乎不会更新记录.

根据文档,这是语法:

public long replace (String table, String nullColumnHack, ContentValues initialValues)
Run Code Online (Sandbox Code Playgroud)

为什么叫它initalValues?这是否意味着这些值仅在记录不存在且将要插入时使用?如果是这样,您如何使用该方法更新记录?你在哪里指定新值?

如果我误解了replace()完全是什么,有人可以解释它的目的是什么吗?

java sqlite android

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

为什么在获取结果的两倍时,相同的SQLite查询速度要慢30倍?

我一直在努力加速我现在使用大约一周的查询,并在这里询问了几个问题(如何在运行sqlite查询后加快获取结果?,sqlite.fetchall()是否正常是如此之慢?,如何以有效的方式使用min()和max()?).

从那里给出的答案非常有用的帮助下,我设法让时间缩短到sqlite的查询到100.95秒,使用fetchall服用:1485.43.这仍然是不够的,所以在尝试了一些不同的索引后,我设法将查询时间缩短到0.08一个样本的秒数,并将获取时间缩短到54.97几秒钟.所以我觉得我终于设法加快了速度.

然后查询运行下一个样本,花费0.58几秒钟,并且fetchall花费3952.80几秒钟.对于第三个样本,查询花了1.01几秒钟,花了1970.67几秒钟来取消.

第一个样本获取12951行,第二个样本获取24972行,第三个6470行.我很好奇为什么第一个样本获取行的速度要快得多,因为它只有大约一半的量来获取第二个例子.


代码(spectrumFeature_inputValues是(1,),(2,)和(3,),来自使用的3个样本.):

self.cursor.execute('begin')
self.cursor.execute("EXPLAIN QUERY PLAN "+
                    "SELECT precursor_id, feature_table_id "+
                    "FROM `MSMS_precursor` "+
                    "INNER JOIN `spectrum` ON spectrum.spectrum_id = MSMS_precursor.spectrum_spectrum_id "+
                    "INNER JOIN `feature` ON feature.msrun_msrun_id = spectrum.msrun_msrun_id "+
                    "WHERE spectrum.scan_start_time BETWEEN feature.rtMin AND feature.rtMax "+
                    "AND MSMS_precursor.ion_mz BETWEEN feature.mzMin AND feature.mzMax "+
                    "AND feature.msrun_msrun_id = ?", spectrumFeature_InputValues)
print 'EXPLAIN QUERY PLAN: …
Run Code Online (Sandbox Code Playgroud)

python sqlite performance fetchall

32
推荐指数
1
解决办法
6882
查看次数

SQLite/C#连接池和准备语句混淆

我花了一些时间专门为数据库和SQLite阅读不同的最佳实践.在阅读时我发现我做了很多我不应该做的事情,在尝试修复这些问题时,我在考虑使用SQLite及其ADO实现的一些更精细的细节时感到困惑.

我的困惑源于准备好的陈述和连接池.

在阅读http://msdn.microsoft.com/en-us/library/ms971481.aspx时,我发现只应为事务打开连接.交易完成后,应关闭连接.我没有牢牢掌握为什么会这样,但我一直在假设作者知道的比我更好.我明白当连接关闭时并不意味着它实际上已经存在已经关闭.它只是意味着它已被放回池中.

现在,为了改进我的查询和插入,我阅读了有关使用预准备语句 在SQLite中,准备好的语句真的能提高性能吗?http://petesbloggerama.blogspot.com/2007/02/sqlite-adonet-prepared-statements.html似乎都表明,当执行多次执行的查询时,准备好的语句是可行的.我还读过,预准备语句特定于连接,并且一旦连接关闭,预准备语句就会丢失.

我的困惑是这个.如果我打开和关闭我的连接(可能或不可能意味着由于线程池而关闭连接)那么我从准备好的声明中获得了多少用处?我可以理解,如果我有1000个对象,我需要在单个事务中保存,准备好的语句可以帮助很多.但是我不相信我会看到在事务中保存单个对象会带来好处,因为一旦我关闭了连接,从第一个对象生成的预准备语句现在就会丢失.这是真实的陈述吗?

我相信准备好的语句与我的SQLiteCommand对象的范围有关,这进一步加剧了我的困惑.

如果我创建一个表示我将经常执行的查询的SQLiteCommand,我是否需要将SQLiteCommand保留在内存中以使预准备语句保持活动状态?

如果我用相同的SQLite语句创建一个新的SQLiteCommand,它是否认识到新的SQLiteCommand与前一个相同,因此有一个可以使用的预准备语句?

如果我在内存中保留一个SQLiteCommand并更改它的参数和连接,因为我打开并关闭不同事务的连接,我基本上在不同的连接之间保持一个准备好的语句?

我很可能在这一点上思考问题,但我希望你能帮助我更好地理解这些事情是如何相互作用的,这样我才能从中获益最多.

c# sqlite connection-pooling prepared-statement

32
推荐指数
2
解决办法
1万
查看次数

使用Python sqlite3进行交易

我正在尝试将一些代码移植到使用sqlite数据库的Python,而我正试图让事务工作,我真的很困惑.我真的很困惑; 我在其他语言中经常使用sqlite,因为它很棒,但我根本无法弄清楚这里有什么问题.

这是我的测试数据库的模式(将被输入sqlite3命令行工具).

BEGIN TRANSACTION;
CREATE TABLE test (i integer);
INSERT INTO "test" VALUES(99);
COMMIT;
Run Code Online (Sandbox Code Playgroud)

这是一个测试程序.

import sqlite3

sql = sqlite3.connect("test.db")
with sql:
    c = sql.cursor()
    c.executescript("""
        update test set i = 1;
        fnord;
        update test set i = 0;
        """)
Run Code Online (Sandbox Code Playgroud)

你可能会注意到故意的错误.执行更新后,这会导致SQL脚本在第二行失败.

根据文档,该with sql语句应该围绕内容建立一个隐式事务,只有在块成功时才会提交.但是,当我运行它时,我得到了预期的SQL错误...但是i的值从99设置为1.我希望它保持在99,因为第一次更新应该回滚.

这是另一个测试程序,它显式调用commit()rollback().

import sqlite3

sql = sqlite3.connect("test.db")
try:
    c = sql.cursor()
    c.executescript("""
        update test set i = 1;
        fnord;
        update test set i = 0;
    """)
    sql.commit()
except sql.Error:
    print("failed!")
    sql.rollback() …
Run Code Online (Sandbox Code Playgroud)

sqlite python-2.7 python-db-api

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