我使用NHibernate作为我的dataacess,有一段时间我并没有使用SQLite进行本地集成测试.我一直在使用文件,但我想我会把:memory:选项.当我启动任何集成测试时,似乎创建了数据库(NHibernate吐出表创建sql)但是与数据库交互会导致错误.
有没有人让NHibernate与内存数据库一起工作?它甚至可能吗?我正在使用的连接字符串是这样的:
Data Source=:memory:;Version=3;New=True
Run Code Online (Sandbox Code Playgroud) 我试图摆脱的错误信息是:
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调用?
在SQLite中,当我说:
CREATE TABLE my_table
(
my_column VARCHAR
);
Run Code Online (Sandbox Code Playgroud)
如果没有指定VARCHAR大小,使用的默认大小是多少?
我似乎无法在sqlite.org找到它或从我的数据库文件中找到它.
我知道,SQLite不强制尝试的东西时,大小varchar(500)为varchar(30),但有没有权衡在初始大小规格,什么是最好的做法?
我想在表中插入值.但是只插入了一个值.当我尝试插入新值时,我在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) 我有一张桌子,里面有大约17个田地.我需要在此表中执行频繁更新.但问题是每次我只更新几个字段.什么是在这种情况下编写查询以进行更新的最佳方法?我正在寻找一个选项,只有当它不为null时才会更新值.
例如,我在数据库Say A,B,C,D中有四个字段.用户更新说D的值.所有其他值保持不变.所以我想要一个更新查询,它只更新D的值,保持其他人不变.所以如果我把a,b和c作为null并且d与用户提供的值我想写一个更新查询,它只更新d的值为a,b和c为null.这是可以实现的吗?
我正在使用SQLite数据库.
有人可以请一些光吗?
我想将存在于磁盘上的目录存储到数据库中,同时保持其层次结构/树结构.
这是一个无花果,
(ROOT)
/ \
Dir2 Dir3
/ \ \
Dir4 Dir5 Dir6
/
Dir7
我正在使用SQLite数据库.
请建议我在SQLite数据库中存储上述结构的sql查询.
和一个查询,以便在我选择一个目录时检索目录的完整路径.
即假设我选择Dir6然后我会得到像ROOT/Dir2/dir3/dir7这样的完整路径
我需要对我的数据库执行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()完全是什么,有人可以解释它的目的是什么吗?
我一直在努力加速我现在使用大约一周的查询,并在这里询问了几个问题(如何在运行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) 我花了一些时间专门为数据库和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并更改它的参数和连接,因为我打开并关闭不同事务的连接,我基本上在不同的连接之间保持一个准备好的语句?
我很可能在这一点上思考问题,但我希望你能帮助我更好地理解这些事情是如何相互作用的,这样我才能从中获益最多.
我正在尝试将一些代码移植到使用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 ×10
android ×2
c# ×2
database ×2
java ×2
python ×2
sql ×2
fetchall ×1
nhibernate ×1
orm ×1
path ×1
performance ×1
python-2.7 ×1
sql-update ×1
tree ×1