Страницы

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

понедельник, 13 мая 2019 г.

sqlalchemy отношения


Товарищи, подскажите, как с помощью sqlalchemy организовать такой функционал. Есть две таблицы: категории и под категории, во второй есть ключ на первую. Когда создается компания, она должна указывать направление деятельности, но ее деятельность, может быть гораздо уже и ограничиваться несколькими элементами из этой категории. Покажите, пример, как описать классы, и чтобы можно было получить все категории компании, категории и их под категории, а так же, чтобы по (под категориям и категориям) я мог найти все компании.


Ответ

А есть ли смысл разделять категории и подкатегории? Сделайте одну таблицу категорий, у которых есть ссылка на родительскую категорию (на себя же). Это позволит произвольную вложенность подкатегорий и уберет лишнюю сущность. Получится что-то вроде такого:
from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import Column, Integer, String from sqlalchemy import ForeignKey from sqlalchemy.orm import relationship
Base = declarative_base()
class Company(Base): __tablename__ = 'company'
id = Column(Integer, primary_key=True) name = Column(String)
def __repr__(self): return 'class Category(Base): __tablename__ = 'category'
id = Column(Integer, primary_key=True) name = Column(String) parent_id = Column(Integer, ForeignKey('category.id'))
parent = relationship('Category', remote_side=id, backref='subcategories')
def __repr__(self): return 'class Relationship(Base): __tablename__ = 'relationships'
company_id = Column(Integer, ForeignKey('company.id'), primary_key=True) category_id = Column(Integer, ForeignKey('category.id'), primary_key=True)
company = relationship('Company', backref='categories') category = relationship('Category', backref='companies')
def __repr__(self): return 'Вот пример использования:
>>> c1 = Company(name='Google') >>> c2 = Company(name='Yahoo') >>> cat1 = Category(name='IT') >>> cat2 = Category(name='Search engine', parent=cat1) >>> cat1.subcategories [>> cat2.parent >>> c1.categories.extend([Relationship(category=cat1), Relationship(category=cat2)]) >>> c1.categories [>> c1.categories[1].category.name 'Search engine' >>> c2.categories []

Как в golang подключить другой файл?

Как в golang подключить другой файл?
Я начал только экспериментировать с ним и пока пишу в одном файле.
Хотелось бы часть кода перенести в другой и подключить его к main.go


Ответ

Import declarations — объявления импорта
выдержка из документации
An import declaration states that the source file containing the declaration depends on functionality of the imported package (§Program initialization and execution) and enables access to exported identifiers of that package. The import names an identifier (PackageName) to be used for access and an ImportPath that specifies the package to be imported.
мой вольный перевод:
объявление импорта (import) гласит, что файл, содержащий это объявление, зависит от функциональности импортируемого пакета (см. §Program initialization and execution), и позволяет получить доступ к экспортируемым пакетом идентификаторам. объявление назначает идентификатор (PackageName) для доступа, а также ImportPath, который точно определяет местоположение импортируемого пакета.
примеры:
Import declaration Local name of Sin
import "lib/math" math.Sin import m "lib/math" m.Sin import . "lib/math" Sin
import _ "lib/math"

“cannot refer to unexported name” при вызове функции из пакета

Есть главный файл:
package main
import ( "net/http" "./extensions" )
func main() {
router := mux.NewRouter() s := http.StripPrefix("/static/", http.FileServer(http.Dir("./files/"))) router.HandleFunc("/", handlers.Index) router.PathPrefix("/static/").Handler(s) http.Handle("/", router)
handlers.sayYess() http.ListenAndServe(":5000", nil) }
И файл handlers.go
package handlers
import ( "log" )
func sayYess() { log.Println("yess") } func Index(w http.ResponseWriter, r *http.Request) { fmt.Fprintln(w, "hello") }
Функция sayYess() не вызывается - пишет:
cannot refer to unexported name handlers.makeCache
и
undefined: handlers.makeCache
Почему другие функции пакета работают, а эта - нет?


Ответ

Разобрался. Как ни странно, первая буква должна быть большой:
func SayYess() { log.Println("yess") }

Ошибка при использовании IoC-контейнера Unity

Пробую работать с IoC-контейнером Unity, установил через nuget, и получаю такую ошибку
В references
В чём проблема?


Ответ

Проблема в том, что Ваш проект использует .net framework версии ниже 4.5, например, 4.0.
Вы можете поменять версию .net framework, используемую в проекте, в настройке проекта на вкладке Application, в разделе Target framework.
Или же, Вы можете взять более старую версию Unity, например, 2 версию. Выбрать более старую версию можно так же через NuGet.

Приостановка потока на неограниченное время

Как наиболее оптимально из главного потока приостановить дочерний поток (Thread и Runnable) на неограниченное время, а затем его возобновить?


Ответ

Не пользуйтесь методами Thread.suspend() и Thread.resume(). Это лучше осуществить с помощью wait()/notify()

Отказано в доступе при использовании Directory.GetFiles

Я хочу получить список файлов, которые находятся во вложенных директориях и использую:
Directory.GetFiles(string,string,SearchOption)
Но через какое-то время я получаю ошибку: "Отказано в доступе".
Я посмотрел в дебагере и обнаружил, что Directory.GetFiles натыкается на какие-то скрытые системные папки, которые мне в принципе не нужны.
Можно ли как-нибудь задать игнорирование подобных папок?
Если я оберну все в try/catch, то боюсь, что я не получу нужны мне список.


Ответ

Взял отсюда
private List GetFiles(string path, string pattern) { var files = new List();
try { files.AddRange(Directory.GetFiles(path, pattern, SearchOption.TopDirectoryOnly)); foreach (var directory in Directory.GetDirectories(path)) files.AddRange(GetFiles(directory, pattern)); } catch (UnauthorizedAccessException) { }
return files; }
Функция рекурсивная. При составлении списка файлов будут учитываться обыкновенные папки, а системные не учитываться. Не должно быть такого, что из-за Eхception в конечный результат не войдут обыкновенные файлы.

Console.WriteLine("Started: " + DateTime.Now.ToLongTimeString());
var fileList = GetFiles("c:\\", "*.*");
Console.WriteLine("Finished: " + DateTime.Now.ToLongTimeString()); Console.WriteLine("Files count: " + fileList.Count);
// У меня так: // Started: 12:43:05 // Finished: 12:44:33 // Files count: 427083

Не понятен паттерн конструктора

В примерах по AngularJS, которые используют сервисы всегда демонстрируют такой паттерн:
module.factory('myFactory', function($log) { var myFactory = { this.getLog = function () { console.log('Bla bla bla') } }; return myFactory; });
Не могу понять почему не сделать вот так:
module.factory('myFactory', function($log) { return { this.getLog = function () { console.log('Bla bla bla') } }; });
Зачем нужен этот бесполезный var myFactory?


Ответ

Это скорее всего дело стилистики: возвращать что-либо как есть либо через промежуточную переменную. Использование промежуточной переменной потенциально делает код гибче на случай добавления функционала и дружелюбным к отладке, когда точку остановки можно будет поставить сразу после переменной. На мой взгляд переменными оперировать удобнее, чем анонимными объектами или результатами вызовов. В данном случае, если например фабрику нужно будет расширить миксинами или пронаследовать от другого объекта, то удобнее это будет сделать с использованием переменной. Хочу поделиться еще одним вариантом, который описывается в Angular Style Guide
module.factory('myFactory', function($log) {
var myFactory = { foo: foo, bar: bar };
return myFactory; ////////
function foo() { console.log('foo'); }
function bar() { console.log('bar'); } }
Плюс в том, что размещение публичного интерфейса сверху делает код фабрики читаемее и позволяет сразу увидеть все, с чем она позволяет работать + сразу видно то, что нужно покрывать тестами. Это особенно полезно тогда, когда код фабрики разрастается и приходится скроллить, чтобы понять, что вообще в ней есть. Применим этот подход не только к фабрике, но и контроллерам, директивам и т.д.