Страницы

Поиск по вопросам

Показаны сообщения с ярлыком sqlite3. Показать все сообщения
Показаны сообщения с ярлыком sqlite3. Показать все сообщения

суббота, 21 марта 2020 г.

Как передать именованный аргумент sqlite?

#python #python_3x #sqlite #sqlite3


Не могу разобраться, как мне передать именованный аргумент (переменную) в базу данных.

Создал базу данных следующим образом:

import sqlite3

conn = sqlite3.connect("mydatabase.db")
cursor = conn.cursor()

cursor.execute("CREATE TABLE users (id numeric)") #пробовал и текстовое значение


Пытался вставить переменную так:

ids = [] #заполненный список с значениями, которые мне нужно вставить
for i in ids:
   cursor.execute("INSERT INTO users VALUES (?,)", i) #пробовал через форматирование
строки, тоже не вышло


Что я делаю не так?
    


Ответы

Ответ 1



cursor.execute(sql, parameters) в качестве параметров ожидает итерируемый объект (обычно список или кортеж): ids = [1,2,3] for i in ids: cursor.execute("INSERT INTO users VALUES (?)", (i,)) # qmark style # NOTE: ----------------------------> ^^^ ^^^^ используем именованные параметры: for i in ids: cursor.execute("INSERT INTO users VALUES (:id)", {"id": i}) # (named style) ВНИМАНИЕ: (<скаляр>) - не является кортежем! In [55]: i = 1 In [56]: type( i ) Out[56]: int In [57]: type( (i) ) # / NOTE! Out[57]: int # \ (i) - это просто скаляр, а не кортеж In [58]: type( (i,) ) Out[58]: tuple

пятница, 10 января 2020 г.

Visual Studio Windows Phone 10. Исключение - BadImageFormatException

#c_sharp #sqlite3 #uwp #windows_10_mobile


Во время запуска универсальной программы Windows10 на телефоне, происходит исключение
BadImageFormatException. На MSDN написано, что выдается при недопустимом образе файла
библиотеки динамической компоновки (DLL) или выполняемой программы. Исключение происходит
в строках:

path = Path.Combine(Windows.Storage.ApplicationData.Current.LocalFolder.Path, "MyDB.db");
conn = new SQLite.Net.SQLiteConnection(new SQLite.Net.Platform.WinRT.SQLitePlatformWinRT(),
path);


Я правильно понимаю, что на телефоне, нужно по другому указать путь к локальным файлам?
Если да, то какой путь нужно указывать (path)?
    


Ответы

Ответ 1



Подключаться правильно нужно так: await ApplicationData.Current.LocalFolder.GetFileAsync("MyDB.db"); Connection = new SQLiteAsyncConnection("MyDB.db"); Тут есть гайд

четверг, 19 декабря 2019 г.

SQlite - LİKE

#sqlite3 #android #sqlite


Привет.
SELECT * FROM clients WHERE client_data LIKE '%Mark%' ORDER BY `client_id` ASC

Мне необходимо организовать поиск клиента в SQLite по имени (которое расположено
в тексте описания, не спрашивайте, пожалуйста, почему, такой мне ее дали), дело в том,
что когда я использую LIKE '%Mark%', то в результате находятся и строки где встречается
допустим слово markers (тут в принципе все правильно LIKE %% так и должен искать).
Вопрос в том, что можно использовать для поиска в SQLite слова (целиком) в тексте.
Желательно без использования библиотек.
Погуглил, но ничего путного не нашел. (Может плохо искал, в любом случае буду благодарен
даже за линк в гугле)
Заранее спасибо!
P.S 
Нашел как я считаю самое приемлемое решение. Оставлю здесь ответ если кому вдруг
понадобиться. Для полно текстового поиска лучше всего использовать FTS3 (Full-Text-Search).
Подробнее на английском, на русском
Если у кого-то есть решения получше, буду рад узнать.    


Ответы

Ответ 1



Недавно сам сталкивался с такой проблемой - проблемой поиска русских фраз в sqlite андроидовском. Все дело в операторах LIKE, ORDER BY, которые используют функцию UPPER() и которая не может корректно работать с русскими символами. Досадно. Поэтому есть 3 решения, по убыванию сложности: Скомпилировать sqlite с нужным расширением под Android NDK и юзать ее(см статью на Хабре) Использовать расширение, которое уже есть стандартно - FTS3. Создание специальных виртуальных таблиц с поддержкой поиска и использование оператора MATCH Создать в вашей таблице еще один столбец(нормализованный), который будет содержать ту же инфу по которой вам нужно провести поиск, только в верхнем(или нижнем) регистре и делать LIKE по этому столбцу, но результат возвращать по обычному столбцу. Я использовал 3 вариант и не прогадал. Наиболее простой и рабочий:)

Ответ 2



Собственно что мешает сделать вот так: ...client_data LIKE '% Mark %' мм...

воскресенье, 15 декабря 2019 г.

Выбор чисел Фибоначчи

#mysql #sql #postgresql #sqlite3


Задача не практическая. Хочется оценить, какими подходами ее можно решить на SQL'ях
разных диалектов (PostgreSQL, SQLite3, MySQL). И как сложно это решаемо.

Задача

Есть таблица с положительными числами [0..N]. Нужно вывести в порядке возрастания
все числа из указанной таблицы, которые входят в последовательность Фибоначчи.
    


Ответы

Ответ 1



Генератор без использования таблиц для SQLite, postgresql: WITH Recursive Q(Num,Prev) as( select 1,1 union all select Q.Num+Q.Prev,Q.Num from Q where Q.Num<10000 ) select Num from Q Если надо выбрать из них только те числа, что есть в некой таблице - то в итоговый select добавить join с этой таблицей для проверки наличия числа в ней. Для MS SQL и Oracle - убрать из запроса выше фразу Recursive. Для Oracle дополнительно добавить from DUAL после select 1,1. Для MySQL требуется опорная таблица с нужным количеством записей, содержимое этих записей значения не имеет: select @tmp:=@Prev+@Num as Num, @Prev:=@Num, @Num:=@tmp from seqnum, (select @Prev:=1, @Num:=1) A order by Num Это опять же генератор. Для проверки наличия в некой таблице - заключить в подзапрос и сделать join.

Ответ 2



Отвечаю сам себе :) пока для PostgreSQL: Решается в несколько этапов: 1) Поиск максимального значения в таблице 2) CROSS JOIN всей таблицы с результатом выборки от хранимой процедуры по соответствию CREATE OR REPLACE FUNCTION fib(f INTEGER) RETURNS SETOF INTEGER LANGUAGE SQL AS $$ WITH RECURSIVE t(a,b) AS ( VALUES(0,1) UNION ALL SELECT greatest(a,b), a + b AS a FROM t WHERE b < $1 ) SELECT a FROM t; $$; где аргументом будет максимальное значение из таблицы Для SQLite3 и MySQL ждем-c ... ) Хотя, чего греха таить, возможно и для PostgreSQL без хранимой процедуры.

вторник, 16 июля 2019 г.

Правильная работа с SQLite-базой в Android

Есть готовая БД, лежащая в assets, которая копируется в папку приложения (ну, как обычно, в /data/data/app_name/databases). Создание и копирование происходит во внешнем (обычном new Thread()) потоке при старте приложения. За идею взята эта статья: линк У многих пользователей появляются разные ошибки при старте приложения, а у других все работает. Сдается мне, что описанный подход распространения готовой БД ошибочен, либо содержит неточности, которые нужно знать. Как вариант, есть мысль хранить данные не в базе, а в файле, который при возникновении ошибок снова парсится и заполняется база в методе onCreate() SQLiteOpenHelper Как вы решаете перенос готовой базы в приложение? Как работаете со своей БД? Есть куча туториалов и все как один создают структуру БД в onCreate(), делают апдейт в onUpgrade(), но готовая база распространяется в основном, как описано по ссылке. Ошибки, возникающие при таком подходе (из статьи по ссылке): No such table android_metadata. Правда автор статьи это исправил созданием этой таблице в готовой БД, но подход сомнителен, ибо система сама создает эту таблицу в каждой базе. Теперь вот поймал ошибку такую: Issues На некоторых девайсах было, что при открытом коннекте после вызова getReadableDataBase() валится приложение (например, на HTC Desire).


Ответ

Правильная работа с БД в Android - это наследование SQLiteOpenHelper и переопределение методов onCreate и onUpgrade. В первом мы создаем базу данных. Например, можем распарсить данные и создать бд. Во втором мы обновляем базу, удаляя ею старую версию. Когда мы получаем объект БД и в дальнейшем вызываем getReadableDatabase()/ getWritableDatabase() вызывается наш метод onCreate() и если база не создана, она будет создана вновь. Можно также переопределить и эти методы. Но обычно так не делается. Все выше изложенное из моей практики.

суббота, 13 июля 2019 г.

ошибка в при подключении гема sqlite3 в Rails проект в Ubuntu

пытаюсь поднять чужой Rails проект и модернизировать его. логи
~/Стільниця/My_RP/Inspinia clean code/Rails_Full_Version$ bundle install Fetching gem metadata from https://rubygems.org/.......... Fetching version metadata from https://rubygems.org/.. Fetching dependency metadata from https://rubygems.org/. Using rake 10.4.2 Using i18n 0.7.0 # Using длинный список других гемов Using sprockets 3.5.2 Gem::Ext::BuildError: ERROR: Failed to build gem native extension.
current directory: /home/leetsworker/Документи/My_RP/Inspinia clean code/Rails_Full_Version/vendor/bundle/ruby/2.3.0/gems/sqlite3-1.3.11/ext/sqlite3 /usr/bin/ruby2.3 -r ./siteconf20170606-21419-hzoj8s.rb extconf.rb mkmf.rb can't (еще для корректной подсветки') find header files for ruby at /usr/lib/ruby/include/ruby.h
extconf failed, exit code 1
Gem files will remain installed in /home/leetsworker/Документи/My_RP/Inspinia clean code/Rails_Full_Version/vendor/bundle/ruby/2.3.0/gems/sqlite3-1.3.11 for inspection. Results logged to /home/leetsworker/Документи/My_RP/Inspinia clean code/Rails_Full_Version/vendor/bundle/ruby/2.3.0/extensions/x86-linux/2.3.0/sqlite3-1.3.11/gem_make.out
An error occurred while installing sqlite3 (1.3.11), and Bundler cannot continue. Make sure that `gem install sqlite3 -v '1.3.11'` succeeds before bundling. ~/Стільниця/My_RP/Inspinia clean code/Rails_Full_Version$ sudo gem install sqlite3 -v '1.3.11' [sudo] пароль: Building native extensions. This could take a while... ERROR: Error installing sqlite3: ERROR: Failed to build gem native extension.
current directory: /var/lib/gems/2.3.0/gems/sqlite3-1.3.11/ext/sqlite3 /usr/bin/ruby2.3 -r ./siteconf20170606-21761-172b5en.rb extconf.rb mkmf.rb can't (') find header files for ruby at /usr/lib/ruby/include/ruby.h
extconf failed, exit code 1
Gem files will remain installed in /var/lib/gems/2.3.0/gems/sqlite3-1.3.11 for inspection. Results logged to /var/lib/gems/2.3.0/extensions/x86-linux/2.3.0/sqlite3-1.3.11/gem_make.out ~/Стільниця/My_RP/Inspinia clean code/Rails_Full_Version$
Gemfile
source 'https://rubygems.org'
# Bundle edge Rails instead: gem 'rails', github: 'rails/rails' gem 'rails', '4.2.3' gem 'bootstrap-sass', '~> 3.3.7' gem 'font-awesome-rails', '4.7.0.1'
# Use sqlite3 as the database for Active Record gem 'sqlite3'
# Use SCSS for stylesheets gem 'sass-rails', '~> 5.0.4'
# Use Uglifier as compressor for JavaScript assets gem 'uglifier', '>= 1.3.0'
# Use CoffeeScript for .js.coffee assets and views gem 'coffee-rails', '~> 4.0.0'
# See https://github.com/sstephenson/execjs#readme for more supported runtimes # gem 'therubyracer', platforms: :ruby
# Turbolinks makes following links in your web application faster. Read more: https://github.com/rails/turbolinks gem 'turbolinks'
# Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder gem 'jbuilder', '~> 1.2'
group :doc do # bundle exec rake doc:rails generates the API under doc/api. gem 'sdoc', require: false end
# Use ActiveModel has_secure_password # gem 'bcrypt-ruby', '~> 3.1.2'
# Use unicorn as the app server # gem 'unicorn'
# Use Capistrano for deployment # gem 'capistrano', group: :development
# Use debugger # gem 'debugger', group: [:development, :test]
как исправить эту ошибку?
Вариант решения, который не помогает:
~/Стільниця/My_RP/Inspinia clean code/Rails_Full_Version$ sudo apt install sqlite-dev Зчитування переліків пакунків... Виконано Побудова дерева залежностей Зчитування інформації про стан... Виконано E: Не можу знайти пакунок sqlite-dev ~/Стільниця/My_RP/Inspinia clean code/Rails_Full_Version$ sudo gem install sqlite3 Building native extensions. This could take a while... ERROR: Error installing sqlite3: ERROR: Failed to build gem native extension.
current directory: /var/lib/gems/2.3.0/gems/sqlite3-1.3.13/ext/sqlite3 /usr/bin/ruby2.3 -r ./siteconf20170606-22580-tnqs2g.rb extconf.rb mkmf.rb can't (') find header files for ruby at /usr/lib/ruby/include/ruby.h
extconf failed, exit code 1
Gem files will remain installed in /var/lib/gems/2.3.0/gems/sqlite3-1.3.13 for inspection. Results logged to /var/lib/gems/2.3.0/extensions/x86-linux/2.3.0/sqlite3-1.3.13/gem_make.out


Ответ

Оказалось, для решения задачи надо было установить пакет разработки руби
sudo apt-get install ruby-dev
и потом
sudo bundle install

пятница, 26 октября 2018 г.

Выбор чисел Фибоначчи

Задача не практическая. Хочется оценить, какими подходами ее можно решить на SQL'ях разных диалектов (PostgreSQL, SQLite3, MySQL). И как сложно это решаемо.
Задача
Есть таблица с положительными числами [0..N]. Нужно вывести в порядке возрастания все числа из указанной таблицы, которые входят в последовательность Фибоначчи


Ответ

Генератор без использования таблиц для SQLite, postgresql:
WITH Recursive Q(Num,Prev) as( select 1,1 union all select Q.Num+Q.Prev,Q.Num from Q where Q.Num<10000 ) select Num from Q
Если надо выбрать из них только те числа, что есть в некой таблице - то в итоговый select добавить join с этой таблицей для проверки наличия числа в ней.
Для MS SQL и Oracle - убрать из запроса выше фразу Recursive. Для Oracle дополнительно добавить from DUAL после select 1,1
Для MySQL требуется опорная таблица с нужным количеством записей, содержимое этих записей значения не имеет:
select @tmp:=@Prev+@Num as Num, @Prev:=@Num, @Num:=@tmp from seqnum, (select @Prev:=1, @Num:=1) A order by Num
Это опять же генератор. Для проверки наличия в некой таблице - заключить в подзапрос и сделать join.