Поддержка
sqlite3
в Python может быть немного запутанной. Адаптер базы данных sqlite начинался как отдельный проект pysqlite2 , но для Python 2.5 его версия была включена в стандартную библиотеку Python под именем sqlite3 . Оригинальный адаптер продолжает разрабатываться как отдельный проект, периодически обновляя версию в Python, чтобы соответствовать ей. Если вы пытаетесь использовать более новую версию адаптера, она обычно устанавливается как pysqlite2
, чтобы не противоречить версии, включенной в стандартную библиотеку. И, в зависимости от того, как он был построен, он может ссылаться на другую версию базовой библиотеки sqlite3 database . Поэтому убедитесь, что вы импортируете его правильно:
>>> import sqlite3
>>> sqlite3.version_info
(2, 4, 1)
>>> sqlite3.sqlite_version_info
(3, 6, 11)
>>> from pysqlite2 import dbapi2 as sqlite3
>>> sqlite3.version_info
(2, 5, 5)
>>> sqlite3.sqlite_version_info
(3, 6, 18)
version_info
- это версия адаптера базы данных sqlite3
(pysqlite2
или встроенного sqlite3
). sqlite_version_info
- это версия базовой библиотеки базы данных sqlite3
.
Рекомендуется использовать from ... import ... as sqlite3
, чтобы остальная часть вашего кода не изменялась, если вы переходите от одной версии к другой.
Примечание. enable_load_extension
впервые появился в pysqlite2
2.5.0.
EDIT: enable_load_extension
отключен по умолчанию при создании адаптера , Чтобы включить его, вы можете создать pysqlite2
вручную. Следующий рецепт предполагает систему unix
-y и самую последнюю версию pysqlite2
, которая на момент написания этой статьи составляет 2.5.5.
Во-первых, если вы первоначально установили адаптер через easy_install
удалите его, выполнив первый запуск:
$ sudo /path/to/easy_install -m pysqlite # or whatever package name you first used
Будет выведен какой-то вывод, включая строки, такие как:
Removing pysqlite 2.5.5 from easy-install.pth file
Using /path/to/site-packages/pysqlite-2.5.5-py2.x-something.egg
Удалите яйцо, используя указанное имя файла (имя будет меняться в зависимости от вашей платформы и версии, и может ссылаться на файл или каталог):
$ sudo rm -r /path/to/site-packages/pysqlite-2.5.5-py2.x-something.egg
Теперь загрузите и извлеките исходный архив pysqlite-2.5.5
:
$ mkdir /tmp/build
$ cd /tmp/build
$ curl http://oss.itsystementwicklung.de/download/pysqlite/2.5/2.5.5/pysqlite-2.5.5.tar.gz | tar xz
$ cd pysqlite-2.5.5
Затем отредактируйте файл setup.cfg
, чтобы прокомментировать директиву SQLITE_OMIT_LOAD_EXTENSION
:
$ ed setup.cfg < /SQLITE_OMIT_LOAD_EXTENSION/s/define=/#define=/
> w
> q
> EOF
Поскольку версия sqlite3
настолько старая (3.4.0), вы также должны построить с последним sqlite3
] библиотека. Это облегчено в сценарии pysqlite2
setup.py:
$ /path/to/python2.x setup.py build_static
Это автоматически загрузит последний источник сборки sqlite3 и построит адаптер вместе с -date статически связанную версию sqlite3
.
UPDATE (2015/07/21): В соответствии с последним pysqlite 2.6.3 commit вам нужно загрузить исходный код sqlite на (g19) Теперь установите адаптер:
$ sudo /path/to/python2.x setup.py install
и запустите тесты:
$ cd # somewhere out of the build directory
$ /path/to/python2.x
>>> from pysqlite2 import test
>>> test.test()
и, если
В качестве бонуса, если причина, по которой вы хотите поддерживать расширение загрузки, заключается в использовании полнотекстового расширения sqlite3
, FTS3
, вы должны обнаружить, что это был включен как часть статической библиотеки, и дальнейшая работа не требуется:
>>> from pysqlite2 import dbapi2 as sqlite3
>>> con = sqlite3.connect(":memory:")
>>> con.execute("create virtual table recipe using fts3(name, ingredients)")
Я не уверен на 100%, чего ты хочешь достичь. Этот код откроет клавиатуру при нажатии кнопки и покажет textField только тогда, когда пользователь начнет печатать.
Когда кнопка нажата, мы устанавливаем скрытый ответчик textField в true. Таким образом, мы поднимаем клавиатуру, не показывая textField. Когда пользователь начинает печатать, мы открываем текстовое поле и изменяем его ограничения, чтобы они были над клавиатурой.
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var button: UIButton!
@IBOutlet weak var textField: UITextField!
@IBOutlet weak var textFieldBottomConstraint: NSLayoutConstraint!
var keyboardHeight: CGFloat = 0
override func viewDidLoad() {
super.viewDidLoad()
button.addTarget(self, action: #selector(buttonPressed), for: .touchUpInside)
textField.isHidden = true
textField.delegate = self
NotificationCenter.default.addObserver(
self,
selector: #selector(keyboardWillShow),
name: UIResponder.keyboardWillShowNotification,
object: nil
)
}
@objc func buttonPressed() {
textField.becomeFirstResponder()
}
@objc func keyboardWillShow(_ notification: Notification) {
if let keyboardFrame: NSValue = notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue {
let keyboardHeight = keyboardFrame.cgRectValue.height
self.keyboardHeight = keyboardHeight
}
}
}
extension ViewController: UITextFieldDelegate {
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
textField.isHidden = false
textFieldBottomConstraint.constant = keyboardHeight
return true
}
}