Я пытался заставить именованный кортеж работать с SQLalchemy, но безрезультатно. Веб-поиск не очень привлекателен, и я новичок в Python и SQLalchemy, поэтому я не совсем уверен, погоня за ветряными мельницами :( Основная идея в том, что у меня есть именованный кортеж, то есть:
Point=namedtuple('Point',['x','y'])
, который в основном создает класс Point (кортеж), если я прав. Сначала это работает нормально, и я могу создавать такие объекты, как:
p=Point(3,4)
Но после того, как я создаю движок и т. Д. И вызываю маппер, я не могу больше создавать объекты без этой ошибки:
Traceback (most recent call last):
File "<pyshell#62>", line 1, in <module>
f=Point(3,4)
TypeError: __init__() takes exactly 1 argument (3 given)
Есть идеи, почему это происходит? Кто-нибудь знает, как заставить namedtuple работать с sqlalchemy? Конечно, я могу определить свой собственный класс Point, но сейчас я одержим желанием заставить namedtuple работать ...
Я использую Python 2.7, SQLalchemy 0.6.6 (движок sqlite)
Пример:
Я пытаюсь что-то вроде этого:
from sqlalchemy import *
from sqlalchemy.orm import *
from collections import namedtuple
Point=namedtuple('Point',['x','y'],verbose=True)
p=Point(3,4)
db=create_engine('sqlite:///pointtest.db')
metadata=MetaData()
pointxy=Table('pointxy',metadata,
Column('no',Integer,primary_key=True),
Column('x',Integer),
Column('y',Integer),
sqlite_autoincrement=True)
metadata.create_all(db)
m=mapper(Point, pointxy)
Session=sessionmaker(bind=db)
session=Session()
f=Point(3,4)
Основная идея заключается в том, что я хочу именованную коллекцию вещей, которую можно легко сохранить в базе данных. Итак, это:
class Bunch:
__init__ = lambda self, **kw: setattr(self, '__dict__', kw)
не будет работать с sqlalchemy (я думаю). Я могу создать класс Bunch, но я не буду заранее знать, сколько целых я хочу сохранить в своей коллекции. Я установлю его перед созданием базы данных. Я надеюсь, что я понимаю ..