Вопросы по sqlalchemy

1. Можно ли с помощью sqlalchemy получить названия столбцов БД и как-нибудь динамически ими оперировать (не задавая их непосредственно в классе, который мапится)

2. Как, собственно, создавать/удалять/редактировать столбцы

3. Есть у меня записи и тэги со связью многие-ко-многим через третью таблицу, например, как здесь. Как правильно написать класс для таблицы связей с учётом того, что там нет первичного ключа?
  • Вопрос задан
  • 4391 просмотр
Пригласить эксперта
Ответы на вопрос 4
DeNnEr
@DeNnEr
Потребности людей ростут, люди устали от статики и хотят больше динамики.
Увы, SQL-based СУБД не созданы для динамических схем. Если ты будешь часто менять схему, то проиграешь в производительности, очень сильно проиграешь. А это ещё при том, что SQL(а тем более с использованием SA) не так и шустр.

Советую обратить внимание на более современные решения — документ-ориентированные бд. Точнее — на MongoDB и MongoKit как средство для создания и манипулирования схемами.
Дело в том, что документ-ориентированные СУБД созданы как-раз для динамических данных, где схема может часто меняться. Документ в такой БД, тоже самое что и запись(строка, row) в SQL-based, в реляционных БД.
Документ представляет из себя JSON-структуру данных, в которой всё можно менять, дополнять, удалять.
У документа нет «схемы». Т.е. захотел сделать документ с постом пользователя, вот и делай:
db.posts.save({id:1, author:«James», text:«Howdy!»})
Однако, схемы бывают нужны, поэтому для них делаются программные решения вроде MongoKit.
Например, можно указать в MongoKit такую схему:
{
name:unicode,
data:{unicode:unicode}
}
Что позволит оперировать словарём data как хочется.
Схема для поста, например:
{
id:int,
author:unicode,
text:unicode
}

В общем, советую почитать:
www.mongodb.org/
namlook.github.com/mongokit/
Ответ написан
Комментировать
@REDkiy
Оживим труп. :-)
SQLAlchemy требует обязательного(!) присутствия в таблице первичного ключа.
Ответ написан
Комментировать
@NickolayDen
Как сказал REDkiy, просто укажи:

```
id = db.Column(db.Integer, primary_key=True)
```
Ответ написан
Комментировать
mrxak
@mrxak Автор вопроса
спасибо, посмотрю в эту сторону, но всё-таки хотелось бы услышать хотя бы по поводу 3го вопроса
ибо если пишу
class tagged(Base):
__tablename__ = 'tagged'

elem = Column(Integer, key='elem')
tag = Column(Integer, key='tag')

def __init__(self, elem, tag):
self.elem = elem
self.tag = tag

то получаю ответ sqlalchemy.exc.ArgumentError: Mapper Mapper|tagged|tagged could not assemble any primary key columns for mapped table 'tagged'
а делать лишнее поле в таблице не хотелось бы
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы