2016-12-21 7 views
0

Я пытаюсь создать модели для своей базы данных и планирую использовать MySQL в качестве базы данных. Я хочу создать различные атрибуты моделей unsigned MySQL INTEGER s и найти статьи, которые рекомендовали импортировать типы из sqlalchemy.dialects.mysql, такие как INTEGER, BOOLEAN, VARCHAR, чтобы указать специфические ограничения MySQL.INTEGER из sqlalchemy.dialects.mysql не принимает параметров в методе __init__?

Вот моя попытка:

import datetime 

import sqlalchemy 
from sqlalchemy.dialects.mysql import INTEGER, BOOLEAN, VARCHAR 

from app_name import app, db 

class User(db.Model): 
    __tablename__ = 'User' 
    id = db.Column(sqlalchemy.dialects.mysql.INTEGER(usigned=True), primary_key=True, autoincrement=True, nullable=False) 
    realname = db.Column(VARCHAR(256), nullable=False) 
    username = db.Column(VARCHAR(256), nullable=False) 
    joined = db.Column(db.TIMESTAMP, default=datetime.datetime.now) 
    email = db.Column(VARCHAR(255), nullable=False) 

Однако обе вариации линии, определяющей атрибут id, либо: db.Column(sqlalchemy.dialects.mysql.INTEGER(usigned=True), primary_key=True, autoincrement=True, nullable=False)

или

db.Column(INTEGER(usigned=True), primary_key=True, autoincrement=True, nullable=False)

неудачу с некоторым изменением следующие ошибки/трассировка:

File "/Users/Username/Development/App_Name/app_name/models/__init__.py", line 8, in <module> 
    class User(db.Model): 
    File "/Users/Username/Development/App_Name/app_name/models/__init__.py", line 10, in User 
    id = db.Column(sqlalchemy.dialects.mysql.INTEGER(usigned=True), primary_key=True, autoincrement=True, nullable=False) 
    File "/Users/Username/Development/.virtualenvs/app_name/lib/python3.5/site-packages/sqlalchemy/dialects/mysql/types.py", line 254, in __init__ 
    super(INTEGER, self).__init__(display_width=display_width, **kw) 
    File "/Users/Username/Development/.virtualenvs/app_name/lib/python3.5/site-packages/sqlalchemy/dialects/mysql/types.py", line 54, in __init__ 
    super(_IntegerType, self).__init__(**kw) 
    File "/Users/Username/Development/.virtualenvs/app_name/lib/python3.5/site-packages/sqlalchemy/dialects/mysql/types.py", line 24, in __init__ 
    super(_NumericType, self).__init__(**kw) 
TypeError: object.__init__() takes no parameters 

Любое понимание того, почему мои попытки потерпели неудачу?

ответ

1

В общем, вы должны быть бдительны с именами атрибутов, которые были переданы, когда вы видите такую ​​ошибку.

В чем, по существу, говорится об ошибке, object.__init__ получил аргумент, которого он не ожидал. Это происходит, когда вы передаете аргумент **kwargs, определенный __init__, который не обрабатывается и отправляется до object.__init__ во время вызова super (например).

Возьмите следующий фрагмент кода, чтобы воспроизвести подобный сценарий:

class ExampleINTEGER: 
    def __init__(self, **kwargs): 
     # if unsigned is passed, grab it 
     self.unsigned = kwargs.pop('unsigned', None) 
     # yada yada for the rest of the expected args 
     # if it isn't found, it gets forwarded :/ 
     super().__init__(**kwargs) 

>>> ExampleINTEGER(unsigned=True) 
<__main__.ExampleINTEGER at 0x7f41a048f978> 
>>> ExampleINTEGER(usigned=True) 
TypeErrorTraceback (most recent call last) 
<ipython-input-15-4b996bd42b90> in <module>() 
----> 1 ExampleINTEGER(usigned=True) 

<ipython-input-13-6e67a8d8cdde> in __init__(self, **kwargs) 
     4   self.unsigned = kwargs.pop('unsigned', None) 
     5   # if it isn't found, it gets forwarded :/ 
----> 6   super().__init__(**kwargs) 

TypeError: object.__init__() takes no parameters 

В вашем случае (как в макете примере я создал) вы опечатка unsigned с usigned :-)

+0

Это имеет смысл когда это объясняется так: '__init__' для' sqlalchemy.dialects.mysql.INTEGER' будет распознавать только определенные аргументы ключевого слова и игнорировать любые, которые не соответствуют его критериям. Поскольку я ошибся одним из имен параметров, он был проигнорирован и в конечном итоге неправильно распространялся на любые дальнейшие вызовы на разные '__init__'. Спасибо за быстрый ответ, очень ценим! –

+1

точно @SeanPianka. Я не знаком с деревом наследования конкретного класса, но где-то через эти '__init__', которые получают вызванное что-то переданное 'object', которое не должно было иметь. –

 Смежные вопросы

  • Нет связанных вопросов^_^