LINUX.ORG.RU

5
Всего сообщений: 62

Чудит SQLite в Qt (Полное игнорирование NOT NULL, ON DELETE SET DEFAULT и т.д.)

Ребята, столкнулся с непонятной для меня проблемой.

Смотрите, таблица создается так:

CREATE TABLE tbl_transaction (
    id              INTEGER  PRIMARY KEY AUTOINCREMENT
                             UNIQUE
                             NOT NULL,
    name            STRING   NOT NULL,
    description     STRING,
    datetime        DATETIME NOT NULL,
    amount          DECIMAL  DEFAULT (0),
    id_cash_account INTEGER  REFERENCES tbl_cash_accounts (id) ON DELETE SET DEFAULT
                                                               ON UPDATE CASCADE
                             NOT NULL 
                             DEFAULT (1),
    id_category     INTEGER  REFERENCES tbl_category (id) ON DELETE SET DEFAULT
                                                          ON UPDATE CASCADE
                             NOT NULL
                             DEFAULT (1) 
);

То есть, при удалении строки и таблицы id_cash_account - в таблице tbl_transaction в столбце «id_cash_account» появится значение 1 вместо того, что было. Например, допустим таблица tbl_transaction содержит строку:

id = '1'
name = 'test'
description = ''
datetime = '21.07.12 03:08:12'
amount = '3'
id_cash_account = '33'
id_category = '66'

Тогда, если в таблице tbl_cash_accounts мы удаляем строку с id = 33

DELETE FROM tbl_cash_accounts
      WHERE id = '33';

то запись в таблице tbl_transaction должна превратиться в:

id = '1'
name = 'test'
description = ''
datetime = '21.07.12 03:08:12'
amount = '3'
id_cash_account = '1'
id_category = '66'

Так и происходит, если я в СУБД напишу такой запрос, но если я напишу такой запрос и выполню его в Qt - query->exec(textQuery);, то запись в таблице tbl_cash_accounts конечно удалится, а вот значение в tbl_transaction останется прежним - 33.

И проблема не только в этом, к примеру, запросы из Qt так же игнорируют NOT NULL столбцы (то есть из самой субд я пустое значение вставить не могу в таблицу, а если этот же запрос выполнить через QSqlQuery, то оно выполнит вставку без ошибок и отобразит значение в субд)

Я первый раз с таким столкнулся. В чем проблема может быть, господа?

То есть, опять же, как вы видите, в таблице tbl_transaction целых пять столбцов NOT NULL

И если средствами Qt (query->exec) выполнить этот запрос:

INSERT INTO tbl_transaction (id, name, description, datetime, amount, id_cash_account, id_category) VALUES ('0','','','','0','0','0');

ОНО ЕГО ВЫПОЛНИТ! И в СУБД отобразит строку:

id = '0'
name = ''
description = ''
datetime = ''
amount = '0'
id_cash_account = '0'
id_category = '0'

Это уже не говоря о том, как оно на место связей умудрилось нули впихнуть! Мне это просто выносит мозг

 , ,

boganet9993 ()

непонятки с sqlite в php

я недавно использую sqlite именно в php какая то непонятная ошибка да я гуглил то есть искал в duckduckgo.

файл бд создан в программке db browser for sqlite данные заполнены с помощью этой же программы после чего закинут на хостинг.

$dbfile = "tests.db";
$dbfile = 'sqlite:' . $dbfile;
$db = new PDO($dbfile); 
$query = "SELECT * FROM test";
$st = $db -> query($query);
$res = $st -> fetchAll();
...

и получаю ошибку Call to a member function fetchAll() on boolean что за ерунда

 , , ,

Stremitelnyj ()

Почему не вставляются данные в таблицу?

есть скрипт, который использует sqlAlchemy и sqlite3. он отрабатывает без проблем: https://github.com/zlodiak/sql_alchemy_sqlite/blob/master/index.py

есть другой похожий скрипт, который использует sqlAlchemy и postgresql и он не отрабатывает(таблица создаётся, но она пустая):

import random
from sqlalchemy import create_engine, Table, MetaData, select, Column, String, Integer
from sqlalchemy.sql import and_, or_, not_
import psycopg2

engine = create_engine('postgresql://alchemy_user:qwerty@localhost:5432/db_alchemy')
connection = engine.connect()
metadata = MetaData()

quotes = Table('quotes', metadata,
    Column('id', Integer, primary_key=True),
    Column('text', Integer, nullable=False),
    Column('weight', Integer, nullable=False)
)
metadata.create_all(engine)


quotes_json = []
with open("text.txt") as file_handler:
    for line in file_handler:
        quotes_json.append({
            'text': line,
            'weight': random.randint(1, 10),
        })
connection.execute(quotes.insert(), quotes_json)


s = select([quotes]).where(and_(quotes.c.weight > 3, quotes.c.weight < 8))
result = connection.execute(s)
for row in result:
    print(row['id'], row['text'][:20] + '...', row['weight'])

сообщение об ошибке следующее:

(simple_pg) md@md ~/.MINT18/code/python/alchemy/simple_pg $ python index.py
Traceback (most recent call last):
  File "/home/md/.local/share/virtualenvs/simple_pg-epaYC0ys/lib/python3.8/site-packages/sqlalchemy/engine/base.py", line 1225, in _execute_context
    self.dialect.do_executemany(
  File "/home/md/.local/share/virtualenvs/simple_pg-epaYC0ys/lib/python3.8/site-packages/sqlalchemy/dialects/postgresql/psycopg2.py", line 854, in do_executemany
    cursor.executemany(statement, parameters)
psycopg2.errors.InvalidTextRepresentation: invalid input syntax for integer: "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. 
"
LINE 1: INSERT INTO quotes (text, weight) VALUES ('Sed ut perspiciat...
                                                  ^


The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "index.py", line 25, in <module>
    connection.execute(quotes.insert(), quotes_json)
  File "/home/md/.local/share/virtualenvs/simple_pg-epaYC0ys/lib/python3.8/site-packages/sqlalchemy/engine/base.py", line 982, in execute
    return meth(self, multiparams, params)
  File "/home/md/.local/share/virtualenvs/simple_pg-epaYC0ys/lib/python3.8/site-packages/sqlalchemy/sql/elements.py", line 293, in _execute_on_connection
    return connection._execute_clauseelement(self, multiparams, params)
  File "/home/md/.local/share/virtualenvs/simple_pg-epaYC0ys/lib/python3.8/site-packages/sqlalchemy/engine/base.py", line 1095, in _execute_clauseelement
    ret = self._execute_context(
  File "/home/md/.local/share/virtualenvs/simple_pg-epaYC0ys/lib/python3.8/site-packages/sqlalchemy/engine/base.py", line 1249, in _execute_context
    self._handle_dbapi_exception(
  File "/home/md/.local/share/virtualenvs/simple_pg-epaYC0ys/lib/python3.8/site-packages/sqlalchemy/engine/base.py", line 1476, in _handle_dbapi_exception
    util.raise_from_cause(sqlalchemy_exception, exc_info)
  File "/home/md/.local/share/virtualenvs/simple_pg-epaYC0ys/lib/python3.8/site-packages/sqlalchemy/util/compat.py", line 398, in raise_from_cause
    reraise(type(exception), exception, tb=exc_tb, cause=cause)
  File "/home/md/.local/share/virtualenvs/simple_pg-epaYC0ys/lib/python3.8/site-packages/sqlalchemy/util/compat.py", line 152, in reraise
    raise value.with_traceback(tb)
  File "/home/md/.local/share/virtualenvs/simple_pg-epaYC0ys/lib/python3.8/site-packages/sqlalchemy/engine/base.py", line 1225, in _execute_context
    self.dialect.do_executemany(
  File "/home/md/.local/share/virtualenvs/simple_pg-epaYC0ys/lib/python3.8/site-packages/sqlalchemy/dialects/postgresql/psycopg2.py", line 854, in do_executemany
    cursor.executemany(statement, parameters)
sqlalchemy.exc.DataError: (psycopg2.errors.InvalidTextRepresentation) invalid input syntax for integer: "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. 
"
LINE 1: INSERT INTO quotes (text, weight) VALUES ('Sed ut perspiciat...
                                                  ^

[SQL: INSERT INTO quotes (text, weight) VALUES (%(text)s, %(weight)s)]
[parameters: ({'text': 'Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. \n', 'weight': 8}, {'text': 'Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. \n', 'weight': 3}, {'text': 'Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem. \n', 'weight': 10}, {'text': 'Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur?\n', 'weight': 5}, {'text': 'Quis autem vel eum iure reprehenderit qui in ea voluptate velit esse quam nihil molestiae consequatur, vel illum qui dolorem eum fugiat quo voluptas nulla pariatur?\n', 'weight': 5}, {'text': 'At vero eos et accusamus et iusto odio dignissimos ducimus qui blanditiis praesentium voluptatum deleniti atque corrupti quos dolores et quas molestias excepturi sint occaecati cupiditate non provident, similique sunt in culpa qui officia deserunt mollitia animi, id est laborum et dolorum fuga. \n', 'weight': 6}, {'text': 'Et harum quidem rerum facilis est et expedita distinctio. Nam libero tempore, cum soluta nobis est eligendi optio cumque nihil impedit quo minus id quod maxime placeat facere possimus, omnis voluptas assumenda est, omnis dolor repellendus. \n', 'weight': 7}, {'text': 'Temporibus autem quibusdam et aut officiis debitis aut rerum necessitatibus saepe eveniet ut et voluptates repudiandae sint et molestiae non recusandae. \n', 'weight': 9}, {'text': 'Itaque earum rerum hic tenetur a sapiente delectus, ut aut reiciendis voluptatibus maiores alias consequatur aut perferendis doloribus asperiores repellat.', 'weight': 4})]
(Background on this error at: http://sqlalche.me/e/9h9h)

я думал, что sqlAlchemy именно для того и существует чтобы скрывать особенности различных БД и работать с ними через единый интерфейс, а оказалось, что это не так. объясните пожалуйста почему я дурак?

 , , ,

prozaik ()

Как подружить SQLite3 и C++ на веб-сервере?

Приветствую, воскресный ЛОР!

У меня два вопроса.
1 - Можно ли работать с SQLite, используя C++ не C-функции, которые я нашёл в примерах в интернете?
2 - Можно ли будет вкомпилировать БД SQLite3 в свою C/C++-программу?

Нужен именно С++, потому что я боюсь что накасипорю, при использовании С. А вкомпилировать нужно, чтобы использовать в CGI-скрипте на сервере хостинга(онтопик).

Благодарю за ответы!

 , , , ,

xwicked ()

Пехапеционное БДуныние

Опасен мир веб-программиста. Удивительные чудеса поджидают его за каждым файлом.
Вот пример:

$ret = $db->query($sql);
   
   echo "numColumns()=".$ret->numColumns();
   echo "columnType(0)=".$ret->columnType(0)."<br>";
   
   if (($ret->numColumns() > 0) && ($ret->columnType(0) != SQLITE3_NULL))
   {
       echo "in!";
   }else
   {
      echo "out!";
      return false;
   } 


Вот результат:

numColumns()=1columnType(0)=5
out!


Весьма неожиданно. И тут программист начинает подозрительно посматривать на константу SQLITE3_NULL, которая оказывается равна 5.
Тю — скажете вы — на то они и константы чтобы не возиться непосредственно с числами. Не твоё, программист, собачье дело какое там числовое значение у этой константы.
Вот только беда в том что значение columnType всегда равно SQLITE3_NULL. Есть поле? Его тип NULL. Нет поля? Его тип NULL. NULL всегда. NULL во всём. Улю-лю, ура!

Вот так и живём.

 ,

Deleted ()

Не ясна причина утечки памяти

SUMMARY: AddressSanitizer: 350261968 byte(s) leaked in 487181 allocation(s)

Везде где есть prepare или step оно считает за утечку. А в процессах действительно видно как идет зажор памяти:

int db_query(void *db, char *query)
{
	sqlsdb_state *state = (sqlsdb_state*) db;
	sqlite3_stmt *stmt = NULL;
	int rc;

	rc = sqlite3_prepare_v2(state->sqlite, query, -1, &stmt, NULL);
	if(rc != SQLITE_OK) return rc;
	rc = sqlite3_step(stmt);
	sqlite3_finalize(stmt);
	return rc;
}
Если sqlite3_prepare_v2 не вернул SQLITE_OK, то должен ли я вызывать sqlite3_finalize? Так вот утечка сохраняется, несмотря на то что всегда там SQLITE_OK

Пробовал и с бибилиотекой из состава Ubuntu 18.04, так и с https://www.sqlite.org/2019/sqlite-amalgamation-3290000.zip прямо подключенного к проекту, чтобы яснее видеть отладочные символы и места утечек - результат один

Иногда еще показывает на sqlite3_open_v2 как место утечки, хотя close_v2 нормально вызывается

ЧЯДНТ?

 ,

I-Love-Microsoft ()

SQLite3 насколько велика фрагментация

Допустим, есть база SQLite 3.27.x. В нее ежедневно попадают десятки тысяч записей. Но два раза в сутки (каждые 12 часов) все старые записи, старше недели - удаляются. Носитель - CompactFlash.

Благодаря тому что это CF флэшка, хочется верить, что фрагментация не приведет к замедлению более чем в два-три раза скорости чтения базы (выполняя запросы, не просто копирование файла), если сделать кэш в ОЗУ побольше (есть соответствующая pragma).

Но стоит ли мне бороться с фрагментацией страниц, врубать всякие там vacuum? Есть старая реализация базы данных в виде отдельных файлов самопального текстового формата, наверняка они тоже за годы работы системы тоже будут увеличивать (увеличивали) фрагментацию самой файловой системы. До сих пор никто не жаловался на замедление.

Или при таком режиме, удаляя сразу большой шмат данных за 12 часов, будет очищаться большое сплошное пространство внутри файла и фрагментация на краешках этих временных интервалов будет ничтожной? Фрагментация подозреваю касается лишь БД с произвольно добавляемыми и удаляемыми записями, у меня же всё плоско, монотонно и последовательно.

Данные просто добавляются монотонно последовательно, единственное что происходит в плане редактирования - тупо удаление старых записей за период 12 часов одним махом. В процессе прочистки отдельных таблиц - новые данные не добавляются.

 ,

I-Love-Microsoft ()

Remote code execution в SQLite

Have a good day, как говорится. Особенно хорошего дня тем, кто умеет программировать на Си лучше, чем Richard Hipp.

 , , , ,

tailgunner ()

Не могу найти ошибку в скрипте Python

Не могу найти ошибку в скрипте Python...

Выводит 1 строку :

root@BlackPhreaker:~/Desktop/osmocom_script# python print_db_1.py 

259962166   | XXXXXXXXXXXXXX | XXXXXXXXXXXXXX | 2018-11-03 21:04:15 | 2018-11-19 03:47:13 | 2018-11-19 04:48:13 |     2535

А должен выводить 4 строки:

root@BlackPhreaker:~/Desktop/osmocom_script# python print_db_1.py

 
259962166   | XXXXXXXXXXXXXX | XXXXXXXXXXXXXX | 2018-11-03 21:04:15 | 2018-11-19 03:47:13 | 2018-11-19 04:48:13 |     2535

259962166   | XXXXXXXXXXXXXX | XXXXXXXXXXXXXX | 2018-11-03 21:04:15 | 2018-11-19 03:47:13 | 2018-11-19 04:48:13 |     2535

2552628735  | XXXXXXXXXXXXXX | XXXXXXXXXXXXXX | 2018-11-12 23:44:36 | 2018-11-19 03:07:28 | 2018-11-13 00:46:17 |        0

2552628735  | XXXXXXXXXXXXXX | XXXXXXXXXXXXXX | 2018-11-12 23:44:36 | 2018-11-19 03:07:28 | 2018-11-13 00:46:17 |        0
 

#!/usr/bin/python
# -*- coding: utf-8 -*-
#======================================================================================

#======================================================================================

import sqlite3

db = sqlite3.connect('/root/Desktop/hlr.sqlite3')

def read_sql_db():
    with db:
	cur = db.cursor()    
	cur.execute("SELECT s.tmsi as TMSI," #
			"s.imsi as IMSI,"
			"e.imei as IMEI,"
			"s.created as CREATED,"
			"s.updated as UPDATED, " ##/!\##
			"s.expire_lu as EXPIRE,"
			"s.lac as LAC "
			"FROM Subscriber s,"
			"EquipmentWatch ew,"
			"Equipment e "
			"WHERE s.id = ew.subscriber_id")
	while True:
	    row = cur.fetchone()
        
	    if row == None:
		break
	    global TMSIS
	    global IMSIS
	    global IMEIS
	    global CREATED
	    global UPDATED
	    global EXPIRE
	    global LACS
	    TMSIS = row[0]
	    IMSIS = row[1]
	    IMEIS = row[2]
	    CREATED = row[3]
	    UPDATED = row[4]
	    EXPIRE = row[5]  
	    LACS = row[6] 
    	    return TMSIS,IMSIS,IMEIS,CREATED,UPDATED,EXPIRE,LACS
	return None,None,None,None,None,None,None
#			cur.close()
		
read_sql_db()
print("{:11} | {:15} | {:15} | {} | {} | {} | {:8}".format(TMSIS,IMSIS,IMEIS,CREATED,UPDATED,EXPIRE,LACS))

 , ,

BlackPhreaker ()

Быстрое чтение строк в sqlite3

Подскажите, а есть в sqlite3 способ забрать из sqlite результат SELECT быстрее чем sqlite3_prepare/sqlite3_step/sqlite3_finalize?

Результат SELECT около 300k строк. Таким циклом читается пример за 16 секунд. Это очень много. Хотелось бы на порядок быстрее...

 

atrus ()

Правильный запрос

Уважаемые форумчане! Требуется ваша помощь!

(SQLite3, PHP7)

Имеем три таблицы:

  • таблица ld - список людей
  • таблица pr - список предметов
  • таблица sv - связи между людьми и предметами.

К примеру взял человек предмет - тогда INSERT id человека и id предмета в таблицу связей.

CREATE TABLE ld (id INTEGER PRIMARY KEY AUTOINCREMENT, ch TEXT NOT NULL UNIQUE);

CREATE TABLE pr (id INTEGER PRIMARY KEY AUTOINCREMENT, pr TEXT NOT NULL UNIQUE);

CREATE TABLE sv (id INTEGER PRIMARY KEY AUTOINCREMENT, id_ch INTEGER NOT NULL, id_pr INTEGER NOT NULL, UNIQUE(ch, pr));

Мне необходимо получить:

  • Сколько человек связано с каждым предметом
  • (также) Сколько предметов связано с каждым человеком
  • Вывести список предметов, которые не связаны с людьми (которых нет в таблице связей)
  • (также) Вывести список людей, которые не связаны с предметами (которых нет в таблице связей)

Подскажите, как правильно сделать запросы?

 , ,

tonchikp ()

Книги для изучения БД

Посоветуйте пожалуйста актуальные и на Ваш взгляд полезные по SQL книги. В данный момент сам для себя пишу сайтик заметок на Java+SQLite , столкнулся с тем чего не ожидал :) Книги не обязательно должны быть привязаны к конкретной БД, принцип то в основном один.
SQL в универе на заочке с легкостью сдал и впечатление в голове сложилось, что вполне все просто, а тут оказалось, что все не так просто с проектированием нормального рабочего проекта, а не учебной поделки.

 , ,

vik24rus ()

SQLite3 «двойной» JOIN

Уважаемые форумчане! Требуется ваша помощь!

Подскажите пожалуйста как правильно составить JOIN в SQLite3 в следующей ситуации:

Есть таблица имён:

table "names"

name_id - integer primary key autoincrement
name - text

Есть таблица связей:

table "links"

link_id - integer primary key autoincrement
name_a - integer
name_b - integer

name_a и name_b - содержит «name_id» из таблицы «names»

Нужно получить link_id, name_a (с подменой), name_b (с подменой)

Если нужна одна подмена всё выходит без проблем, но когда более одной подмены из одной же таблицы - не получается, чего то я не знаю видимо на данный момент

 , , , ,

tonchikp ()

Как sqlite работает с параллельными транзакциями через QSql?

Представим ситуацию: приложение послало запрос-транзакцию на запись, после чего началось выполнение. В это время, пока не закончилась первая транзакция, на выполнение приходит вторая из параллельного потока. Что будет? Вернется ошибка блокировки или вторая транзакция будет ожидать первую и потом выполнится? Подскажите пожалуйста, не хочется проводить эксперимент, а гугл пока ответа не дал.

 ,

Silerus ()

Юморной SQLite

Привет, эксперты. Столкнулся со странным поведением sqlite. Суть такова: запрашиваю данные юзера «user» из базы, юзера находит и данные отдает, в том числе и хэш пароля. Тут же копирую этот хэш и говорю, покажи юзеров с таким хэшем, sqlite отвечает, что нет таких. Как это возможно? Может я что-то не так делаю?

sqlite> pragma table_info(users);
0|id|int|0||1
1|name|text|1||0
2|password|text|1||0
3|type|int|0|0|0
4|blocked|int|0|0|0
sqlite> select * from users where name='user';
|user|fb131bc57a477c8c9d068f1ee5622ac304195a77164ccc2d75d82dfe1a727ba8d674ed87f96143b2b416aacefb555e3045c356faa23e6d21de72b85822e39fdd|1|0
sqlite> select * from users where password='fb131bc57a477c8c9d068f1ee5622ac304195a77164ccc2d75d82dfe1a727ba8d674ed87f96143b2b416aacefb555e3045c356faa23e6d21de72b85822e39fdd';
sqlite>

Решил заюзать sqlite в своей программе, соотв., когда из программы добавляю юзеров в базу, все ок, авторизация работает. Но стоит поменять пароль юзеру из своей проги (UPDATE users SET password=хэш_пароля WHERE rowid=ид_юзера), как начинается вышепоказанная хрень — не пускает в прогу, т.к. не может найти юзера по связке имя+хэш.

 

s3rjke ()

PHP - execute

Уважаемые форумчане! Требуется ваша помощь!

Подскажите, как эффективно и просто решить задачу:

Есть массив (кстати, может заменить на объект?) и две таблицы в базе данных:

$massive = [

'animal' => 'cat',
'age' => '1',
'color' => 'gray'

];

$db = new PDO('sqlite:file.sqlite');

$db -> exec("CREATE TABLE IF NOT EXISTS 'table1' (
id INTEGER PRIMARY KEY AUTOINCREMENT,

animal TEXT,
age INTEGER

)");

$db -> exec("CREATE TABLE IF NOT EXISTS 'table2' (
id INTEGER PRIMARY KEY AUTOINCREMENT,

animal TEXT,
color TEXT

)");

$prepare1 = $db -> prepare("INSERT INTO 'table1' (animal, age) VALUES (:animal, :age)");
$prepare2 = $db -> prepare("INSERT INTO 'table2' (animal, color) VALUES (:animal, :color)");

Цель: записать массив в обе таблицы. Вроде просто и не было бы вопроса, если бы можно было этот массив отдать в execute и он сам взял что ему необходимо, но насколько я знаю, больше чем нужно параметров нельзя указывать.

Прошу учесть, что задача упрощена! В таблицах куча колонок, а не по две как здесь, поэтому их перечисление трудоёмко, это и заставляет искать иные способы!

 , , ,

tonchikp ()

SQL Update or Insert

Уважаемые форумчане! Требуется ваша помощь!

Подскажите, как правильно? Задача простая, нужно записать визит пользователя в базу данных.

  1. Подключаемся к базе данных.
  2. Обновляем запись о посетителе в таблице.
  3. А вдруг посетитель впервые и его записи нет, значит вставляем запись.
  4. Для развёртывания (для первого запуска): А вдруг таблицы нет, значит создаём таблицу.

Вопрос 1: Беспокоит то, что каждый раз при обновлении (update) куча холостых операций (create, insert), может это как то иначе решается, подскажите.

Вопрос 2: А как вы решаете задачи которые требуются однократно при первом запуске?

Вопрос 3: Подключение к базе данных. Может в другой файл переместить? Но тогда при перемещении файла будут проблемы, а если оставить - то постоянно открывается и закрывается подключение к базе данных в разных файлах.

$db = new PDO('sqlite:file.sqlite');

$db -> exec("CREATE TABLE IF NOT EXISTS 'tableName' (

id PRIMARY KEY AUTOINCREMENT,
user TEXT UNIQUE NOT NULL,
visitCounter INTEGER DEFAULT '0'

)");

$db -> exec("INSERT OR IGNORE INTO 'tableName' (user) VALUES ('user1')");

$db -> exec("UPDATE 'tableName' SET visitCounter = visitCounter + 1 WHERE user = 'user1'");

unset($db);

 , , ,

tonchikp ()

out of memory Error opening database Mac OS

Не могу подключиться к Базе

if(QFile::exists(":db/db.sl3")){
    QSqlDatabase b = QSqlDatabase::addDatabase("QSQLITE");
    b.setDatabaseName(":db/db.sl3");
    qDebug()<<"Database: ";
    if(!b.open()){
    qDebug()<<b.lastError().text();
    }else{
    qDebug()<<"All ok select sqlite_version() AS sqlite_version";
    }
}else{
    qDebug()<<"File not found";
}
Получаю: Database: out of memory Error opening database

Единственное что еще не попробовал установку Sqlite3 как плагина и то потому что не знаю как.

 , ,

mgkirs ()

Использование qmark для имени поля таблицы

Знакомлюсь с sqlite3 в python и не совсем понимаю, предусмотрено ли DB API использование знака вопроса для подстановки имени поля при составлении запроса? В документации подобного использования я не видел, равно как и запрета его.

Пример:

execute("UPDATE books SET name=? WHERE id=?", ("New Name", 1))
- работает
execute("UPDATE books SET ?=? WHERE id=?", ("name", "New Name", 1))
- не работает

Тестовый скрипт полностью: https://gist.github.com/anonymous/763eb2d58e1765235ae5aed5f616f661

 , ,

si0 ()

Python, сильнейшая регрессия SELECT при fetchall()

Всем доброго времени суток!

Имеется небольшой код который создаёт базу и туда закидывает тестовые данные, а затем делает обращение к базе SELECT запросом:

@profile # декоратор для профайлера
def do():
    import os
    import sqlite3

    # смотрим есть ли уже база на дсике
    is_db_exist = os.path.isfile('./123.db')
    print('is_db_exist: {}'.format(is_db_exist))
    # return

    db = sqlite3.connect('123.db')

    # базы на диске нет, значит создаём структуру и добавляем данные
    if not is_db_exist:
        # создаём базу
        db.execute('''
        CREATE TABLE task_list (
        id INTEGER PRIMARY KEY AUTOINCREMENT
        );
        ''')
        db.execute('''
        CREATE TABLE dict (
        id      INTEGER PRIMARY KEY AUTOINCREMENT,
        [key]   TEXT,
        value   TEXT,
        task_id   REFERENCES task_list (id)
        );
        ''')

        db.execute("INSERT INTO task_list (id) VALUES (NULL);")
        db.commit()

        # добавляем тестовые записи
        for i in range(300000):
            db.execute('''
            INSERT INTO 'dict' ('task_id', 'key', 'value') VALUES
                          ('{0}', 'key_1', 'data_1'),
                          ('{0}', 'key_2', 'data_2'),
                          ('{0}', 'key_3', 'data_3'),
                          ('{0}', 'key_4', 'data_4')
            '''.format(i))

        db.commit()

        # проверяем что всё нормально добавилось
        total_added = db.execute('SELECT count(*) from dict;').fetchall()[0][0]
        print('добавлено записей: {}'.format(total_added))

    got = db.execute('select [key], value from dict where task_id like 1')
    fetched = got.fetchall() # вот этот кусок выполняется целых 0.5 секунд, вместо 0.001 секунд

    db.close()

do()

Обратите внимание на этот кусок кода:

    fetched = got.fetchall() # вот этот кусок выполняется целых 0.5 секунд, вместо 0.001 секунд

На одной машине (windows 7) он выполняется целых 0.5 секунд, а на другой (windows 8) 0.001 секунд.

Откуда-то взялась колоссальная регрессия. Я пробовал обновлять питон до последней версии 3.5.3 (в пределах ветки 3.5 эта версия последняя), но толку нету.

На стэке пишут надо добавить индексы и будет всё хорошо, но что-то мне они не помогли.

Коллеги, куда копать, что делать?

 ,

rubro ()