Один из вариантов - написать C / C ++-оболочку, которая выполняет скрипт python на регулярной основе. Ваш конечный пользователь будет запускать исполняемый файл C / C ++, который будет работать в фоновом режиме и периодически выполнять скрипт python. Это может быть не лучшее решение и может не работать, если вы не знаете C / C ++ или хотите сохранить этот 100% -ный питон. Но это похоже на самый удобный подход, поскольку люди привыкли щелкать по исполняемым файлам. Все это предполагает, что python установлен на компьютере вашего конечного пользователя.
Другой вариант - использовать cron job / Task Scheduler, но поместить его в установщик в качестве сценария, чтобы ваш конечный пользователь не должен был сделайте это.
Я выбрал бы уровень абстракции базы данных MDB2 из ГРУШИ - это предоставляет хороший, абстрактный метод для контакта с базой данных. Я рекомендую это, так как это позволяет Вам писать портативный код, который может быть портирован к другому серверу базы данных без многих требуемых изменений (для основного сценария, просто изменение вызова подключения, вероятно, будет достаточно). Это - слияние старого DB, и уровни абстракции Метабазы (DB все еще поддерживается для bugfixes, но был заменен MDB2).
Это предлагает функции, любят, готовятся +, выполняют эмуляцию для DBS, которые не поддерживают его правильно, и позволяет Вам использовать заполнителей, который является хорошей практикой для предотвращения проблем Внедрения SQL.
Это будет работать с: mysql / mysqli, pgsql (PostgreSQL), oci8 (Oracle), sqllite, msql, mssql (Microsoft SQL Server), sybase, informix, fbsql, ibase, odbc.
Взгляните на документацию MDB2, чтобы видеть, как она работает.
Любой путь хорош, пока Вы минимизируете точки, где необходимо изменить код, когда схема базы данных изменяется (вход, фильтрация, проверка, поколение формы и т.д.).
Мне нравится сохранять это простым с PDO, параметрическим SQL и классами, которые абстрагируют возвращенный набор данных (::getActiveUsers()
, ::getUserPersonalData()
и т.д.).
Я делаю двухуровневый подход handcoded:
первый уровень является простым набором функций:
после этого я пишу свой образцовый слой с определенными функциями для всех операций данных. обычно единственный файл с разделами для каждого концептуального объекта. параметры связываются с абстрактными данными, не со структурой SQL. весь SQL находится в этом слое.
Используйте структуру MVC и уровень абстракции базы данных. Таким образом, можно перейти к одному месту для завершенной переделки внутренностей класса доступа к данным при сохранении открытого интерфейса постоянным.
Необработанный SQL всюду по коду будет почти на невозможном для масштабирования.
Можно также хотеть рассмотреть использование CodeIgniter, миленькой платформы MVC для PHP. Это имеет и реализацию ActiveRecord и разумный набор Объектов базы данных (включая связанные переменные). Я нахожу его классы DB намного более хорошими, чем API MySQL PHP по умолчанию и немного более простыми, чем PDOs (конечно, легче установить).
Для выполнения команды я использовал бы функции для обычно выполняемых команд SQL. Эти функции могут затем использоваться для создания чего-то более конкретным как get_users ()
a) Сделайте функцию для каждого из запросов, которые Вы могли бы хотеть сделать, такой как
db_select($opts)
где $opts является массивом хеша с ключами:
['table_name', 'selection', 'condition', 'group_by', 'order_by', 'limit']
b) Если бы Вы использовали SQL в большой степени, то я мог бы испытать желание сделать разработчика команды SQL, который берет массив хеша и возвращает команду. Что-то как:
db_builder(array('select'=>array('customers','from'=>'bar','where'=>'foo=10')))
Вышеупомянутые функции использовали бы это в своих реализациях, и так будете Вы, если Вам будет нужен абсолютно случайный оператор, и надо надеяться все это было бы горным телом путем многократного использования разработчика команды код везде.
По крайней мере используйте PDO. Это предоставляет единый интерфейс большинству платформ базы данных, помогая переключить решения для базы данных, должны Вы когда-либо желать к.
Мне нравится использовать Объектный реляционный картопостроитель (ORM), как продвиньте: http://propel.phpdb.org/trac/
Это отображает Ваши объекты прямо на схему базы данных - никакой требуемый SQL. Отображение происходит в XML-файле, Запросы происходят через объекты Критериев. Возможно перепроектировать классы PHP от базы данных или генерировать базу данных из схемы xml.
Для получения дополнительной информации о ORM в целом, см. http://en.wikipedia.org/wiki/Object-relational_mapping
"Это зависит"
Для моих собственных проектов я склонен использовать какую-то платформу, которая включает уровень абстракции. Для меньших проектов, которые не подходят для framewok, я просто исправил SQL в сценарии (потому что это является маленьким). В прошлый раз, когда я сделал большое приложение без платформы, я использовал PDO, поскольку это - легкая подготовленная поддержка оператора и т.д. Это - довольно легко изучаемый уровень абстракции. Я, вероятно, использовал бы его снова, если бы я принял решение не использовать платформу по некоторым причинам.
Кроме этого я также читал о LINQ в.NET, но не видел, что это реализовало в PHP.
Что-то как Linq еще не может быть реализовано в PHP, потому что язык испытывает недостаток в необходимых конструкциях. Своего рода "фальшивка linq" была создана, но это просто использует строки и не является "реальным" linq. И даже если это было, это - эффективно просто equivilent Linq к объектам и нет ничего там как Linq к SQL.
Это определенно будет зависеть от того, как большой из веб-приложения Вы пишете. Я добавлю свои ползунки для Доктрины (при соответствующем использовании). Если это - далеко маленький quick-n-dirty проект, Вам могло бы, вероятно, просто сойти с рук использование PDO.
Что другие шаблоны там?
ActiveRecord - Вы видите пример этого в CakePHP.
Я думаю, что это высоко зависит от Ваших потребностей - если Вы создаете небольшое приложение, это, вероятно, более быстро для создания слоя базы данных DIY.
Если Вы создаете большое приложение с большим количеством таблиц, и отношения, с помощью чего-то как функциональность ActiveRecord CakePHP, вероятно, будут более быстрыми и легче.
Я еще не использовал уровень абстракции ГРУШИ, но это также выглядит хорошим. Пехлеви также имеет библиотеку Database в платформе Зенда.
То, что Вы ищете, является Объектной Реляционной моделью (ORM). Существует пара различных там:
Если бы ORM слишком много для Вашего проекта, то Вы просто отступили бы к универсальному интерфейсу БД как PDO, и сборка подготовила операторы вручную.
Если Вы хотите объектно-ориентированный подход, вот то, чем мой подход недавно был.
Я разделяю вещи в два класса,
Во-первых, класс DatabaseTable - берет имя таблицы, строка, которая является что ключ таблицы. Во-вторых, я создаю класс DatabaseObject, который представляет строку в DatabaseTable. DatabaseObject имеет две стандартных программы setFromRow и getAsRow. SetFromRow установит объект от ассоциативного массива седла => пары значения, и добираться, поскольку строка по существу сериализирует объект как седло => пары значения.
DatabaseTable использует setFromRow для производства DatabaseObjects, когда избранный метод называют на таблице. С другой стороны, когда этому говорят обновить или вставить данные в его таблицу, DatabsaeTable сериализирует DatabaseObject с помощью getAsRow.
Обычно то, что происходит, каждый наследовался DatabaseObject для их собственного конкретного объекта, определяет setFromRow и getAsRow, и DatabaseTable говорят название DatabaseObject для инстанцирования.
Таким образом, то, что Вы заканчиваете тем, что писали, кодируйте мудрый, является чем-то вроде этого
$dbTable = new DatabaseTable('tableName', 'uniqueid', 'InstanceType')
// dbTable manufactures an InstanceType for our use based on the select below
$dbRow = $dbTable->selectUsingId(15);
print_r($dbRow); // Dumps the InstanceTypeObject
Это разделяет представление данных (DatabaseObject) в моем приложении от управления таблицами базы данных (DatabaseTable). Таким образом, мой DatabaseObject может быть, в терминологии C++, простых данных.
Конечно, можно пойти еще больше, как я имею, путем создания отношений между таблицами и создания большего количества способов выбрать, и т.д.
Я должен добавить, что интеграция, что является по существу процедурным языком (SQL) с тем, какая объектно-ориентированность не легка, таким образом, мой метод, я знаю, имеет свои недостатки, и Вы, вероятно, получите много различных ответов каждый с их собственными недостатками.