SELECT Call.ID, Call.date, Call.phone_number
FROM Call
LEFT OUTER JOIN Phone_Book
ON (Call.phone_number=Phone_book.phone_number)
WHERE Phone_book.phone_number IS NULL
Должен удалить подзапрос, позволив оптимизатору запросов работать его волшебство.
кроме того, избегайте "ВЫБОРА *", потому что он может повредить Ваш код, если кто-то изменяет базовые таблицы или представления (и это неэффективно).
Вы можете использовать библиотеку pkg_resources
, которая поставляется с setuptools
.
Например, я быстро создал небольшой пакет "proj"
, чтобы проиллюстрировать схему организации ресурсов, которую я бы использовал:
proj/setup.py proj/proj/__init__.py proj/proj/code.py proj/proj/resources/__init__.py proj/proj/resources/images/__init__.py proj/proj/resources/images/pic1.png proj/proj/resources/images/pic2.png
Обратите внимание, как я храню все ресурсы в отдельном подпакете.
"code.py"
показывает, как pkg_resources
используется для ссылки на объекты ресурсов:
from pkg_resources import resource_string, resource_listdir
# Itemize data files under proj/resources/images:
print resource_listdir('proj.resources.images', '')
# Get the data file bytes:
print resource_string('proj.resources.images', 'pic2.png').encode('base64')
Если вы запустите его, вы получите:
['__init__.py', '__init__.pyc', 'pic1.png', 'pic2.png'] iVBORw0KGgoAAAANSUhE ...
Если вам нужно рассматривать ресурс как файловый объект, используйте resource_stream ()
.
] Код доступа к ресурсам может находиться где угодно в структуре подпакета вашего проекта, ему просто нужно указать полное имя подпакета, содержащего изображения: proj.resources.images
, в данном случае.
Вот установка ".py "
:
#!/usr/bin/env python
from setuptools import setup, find_packages
setup(name='proj',
packages=find_packages(),
package_data={'': ['*.png']})
Предупреждение:
Чтобы проверить что-то «локально», то есть без предварительной установки пакета, вам нужно будет вызвать свои тестовые сценарии из каталога, в котором есть setup.py
. Если вы находитесь в том же каталоге, что и code.py
, Python не узнает о пакете proj
. Поэтому такие вещи, как proj.resources
, не разрешаются.
Вы всегда можете иметь отдельную папку "ресурсы" в каждом подпакете, который в ней нуждается, и использовать функции os.path
для доступа к ним из __ файла __
значения ваших подпакетов. Чтобы проиллюстрировать, что я имею в виду, я создал следующий файл __ init __. Py
в трех местах:
c:\temp\topp (top-level package) c:\temp\topp\sub1 (subpackage 1) c:\temp\topp\sub2 (subpackage 2)
Вот файл __ init __. Py
:
import os.path
resource_path = os.path.join(os.path.split(__file__)[0], "resources")
print resource_path
В c: \ temp \ work , Я создаю приложение topapp.py следующим образом:
import topp
import topp.sub1
import topp.sub2
Это представляет приложение, использующее пакет и подпакеты topp
. Затем я запускаю его:
C:\temp\work>topapp Traceback (most recent call last): File "C:\temp\work\topapp.py", line 1, in import topp ImportError: No module named topp
Это как и ожидалось. Мы устанавливаем PYTHONPATH для имитации наличия нашего пакета на пути:
C:\temp\work>set PYTHONPATH=c:\temp C:\temp\work>topapp c:\temp\topp\resources c:\temp\topp\sub1\resources c:\temp\topp\sub2\resources
Как вы можете видеть, пути к ресурсам правильно разрешены до местоположения фактических (под) пакетов на пути.
Обновление: Здесь '
@ pycon2009, там была презентация по distutils и setuptools. Вы можете найти все видео здесь
Яйца и развертывание сборки в Python - Часть 1
Яйца и развертывание сборки в Python - Часть 2
Яйца и развертывание сборки в Python - Часть 3
В этих видео , они описывают, как включить статические ресурсы в ваш пакет. Я верю, что это часть 2.
С помощью setuptools вы можете определять зависимости, это позволит вам иметь 2 пакета, которые используют ресурсы из третьего пакета.
Setuptools также предоставляет стандартный способ доступа к этим ресурсам и позволяет использовать относительные пути внутри ваших пакетов,