anonymous@RULINUX.NET~# Last login: 2024-03-29 16:05:19
Регистрация Вход Новости | Разметка | Пользователи | Галерея | Форум | Статьи | Неподтвержденное | Трекер | Правила форума | F.A.Q. | Ссылки | Поиск
[#] [Добавить метку] [Редактировать]
Скрыть

Dr.Uid - а почему у меня строки без коммита сохраняются?

Делаю тестовую базу:

sql

sqlite3 test1.sqlite <<EOF
  CREATE TABLE table1(KEY varchar(8), val integer);
  INSERT INTO table1 VALUES('counter',0);
.quit
EOF
 


Вот такой хелловорлд, который апдейтит строку, вставляет ещё одну и просто выходит:
c

/*
 *  Test utility incrementing field in the table
 *  Compilation string:
 *    gcc -o test1 test1.c -lsqlite3
 *
 *  SQLite API: http://www.sqlite.org/c3ref/intro.html
 *   Res.codes: http://www.sqlite.org/rescode.html
 *
 */

#include <sqlite3.h>
#include <unistd.h>
#include <stdio.h>


void fuckup(sqlite3 *dbp, char * sqliteErrorStr, const char * custonMsg){
        if(NULL != sqliteErrorStr){
            fprintf(stderr, "sqlite error: %s\n", sqliteErrorStr);
            sqlite3_free(sqliteErrorStr);        
        }
        if(NULL != custonMsg){
            fprintf(stderr, "%s\n", custonMsg);
        }
        fprintf(stderr, "Lib version: %s\n", sqlite3_libversion());
        sqlite3_close(dbp);
        _exit(1);
}

int main(void) {
   
    sqlite3 *db;
    int rc = sqlite3_open("./test1.sqlite", &db);
   
    if (SQLITE_OK != rc ) {
        fprintf(stderr, "Факап нах: %s\n", sqlite3_errmsg(db));
        printf("Lib version: %s\n", sqlite3_libversion());
        sqlite3_close(db);
        return 1;
    }
   
    char *err_msg = NULL;
    rc = sqlite3_exec(db, "update table1 set val=val+1 where key='counter'", 0, 0, &err_msg);
    if (SQLITE_OK != rc ) {
        fuckup(db, err_msg, "  # error is in update table1");
    }

    /* ===============================================================
     *   Below insert is done in addendum to updating string above
     *   this part can be removed since it does not add up anything
     * ===============================================================
     */


    sqlite3_stmt *res;

    rc = sqlite3_prepare_v2(db, "insert into table1 values('PID', :pid)", -1, &res, NULL);
    if (SQLITE_OK != rc ) {
        fprintf(stderr, "Error in sqlite3_prepare_v2: %d\n", rc);
        fuckup(db, NULL, sqlite3_errmsg(db));
    }
   
    int idx=sqlite3_bind_parameter_index(res,":pid");
    if (0 >= idx ) {
        fprintf(stderr, "sqlite3_bind_parameter_index: %d\n", idx);
        fuckup(db, NULL, sqlite3_errmsg(db));
    }

    rc = sqlite3_bind_int(res, idx, getpid());
    if (SQLITE_OK != rc ) {
        fuckup(db, err_msg, "  # error is in sqlite3_bind_int");
    }
   
    rc = sqlite3_step(res);
    if (SQLITE_DONE == rc) {
        fprintf(stderr, "OK, done!\n");
    }else if (SQLITE_ROW == rc ) {
        fprintf(stderr, "sqlite3_step ROW: %s | %s \n", \
                sqlite3_column_text(res, 0),            \
                sqlite3_column_text(res, 1));
    }else if (SQLITE_OK != rc ) {
        fprintf(stderr, "Errror %d in sqlite3_step: \n", rc);
        fuckup(db, NULL, sqlite3_errstr(rc));
    }

    /* ==========================================
     *   Just EXIT, no commit executed
     *
     *   Intentionally not calling functions below:
     *
     *     sqlite3_finalize(res)
     *     sqlite3_close(db)
     *
     * ==========================================
     */

    return 0;
}
 


Результат такой:
bash

[president@whitehouse]# rm test1.sqlite
[president@whitehouse]# sqlite3 test1.sqlite <<EOF
>   create table table1(key varchar(8), val integer);
>   insert into table1 values('counter',0);
> .quit
> EOF
[president@whitehouse]# sqlite3 test1.sqlite <<EOF
>   select * from table1;
> .exit
> EOF
counter|0
[president@whitehouse]# gcc -o test1 test1.c -lsqlite3 -Wall
[president@whitehouse]# ./test1
OK, done!
[president@whitehouse]# ./test1
OK, done!
[president@whitehouse]# sqlite3 test1.sqlite <<EOF
  select * from table1;
.exit
EOF
counter|2
PID|29343
PID|29390

 


т.е. всё сохраняется. Что я делаю не так?

anonymous(*) (2017-02-25 19:47:40)

Mozilla/5.0 (X11; Fedora; Linux x86_64; rv:51.0) Gecko/20100101 Firefox/51.0

[Ответить на это сообщение]
avatar
Скрыть

Re:Dr.Uid - а почему у меня строки без коммита сохраняются?

python

connect = sqlite3.connect("/databasepath/name.db")
db = connect.cursor()
   
db.execute("""INSERT INTO log (param1, param2, param3)
                            VALUES (NULL,?,?)"""
, query_parma)
#db.commit()
db.close()
 


Вот это у меня без коммита не работало

Dr.uid(*)(2017-02-25 20:00:02)
Отредактировано Dr.uid по причине "не указана"
Mozilla/5.0 (X11; Linux i686; rv:45.0) Gecko/20100101 Firefox/48.0
avatar
Скрыть

Re:Dr.Uid - а почему у меня строки без коммита сохраняются?

Ну так ты бы сразу сказал, что у тебя петун. У него в доке же честно написано, что с транзакциями он делает что-то странное, и если you want autocommit mode, то надо set isolation_level to None.

anonymous(*)(2017-02-25 21:46:56)

Mozilla/5.0 (X11; Fedora; Linux x86_64; rv:51.0) Gecko/20100101 Firefox/51.0
Этот тред читают 1 пользователь:
Анонимных: 1
Зарегистрированных: 0




(c) 2010-2020 LOR-NG Developers Group
Powered by TimeMachine

Valid HTML 4.01 Transitional Правильный CSS!