SQLAlchemy - передача списка столбцов в конструктор таблиц - PullRequest
0 голосов
/ 21 апреля 2020

Я предварительно определяю список объектов Column, которые я хочу передать конструктору Table

from sqlalchemy import create_engine as sqla_create_engine
from sqlalchemy import Table as sqla_Table
from sqlalchemy import Column as sqla_Column
from sqlalchemy import Integer as sqla_Integer
from sqlalchemy import String as sqla_String
from sqlalchemy import MetaData as sqla_MetaData


myColsX = [sqla_Column("id", sqla_Integer, primary_key=True),
               sqla_Column('namex', sqla_String(15)),
               sqla_Column('comment', sqla_String(120))]

Если я вызываю конструктор Table с каждым экземпляром Column, - нет проблем:

myTable = sqla_Table(myTableNameX, myMetaData, 
                        sqla_Column("id", sqla_Integer, primary_key=True),
                        sqla_Column('namex', sqla_String(15)),
                        sqla_Column('comment', sqla_String(120)),
                        extend_existing=True)
myMetaData.create_all(myEngine, tables=[myTable], checkfirst=True)

... и я могу вызывать конструкцию Table несколько раз с чередованием вызовов таблицы DROP.

Если, с другой стороны, я передаю список столбцов как:

myTable = sqla_Table(myTableNameX, myMetaData, *myColsX, 
                        extend_existing=True)

Таблица создается впервые, но с последующим вызовом после команды DROP

я получаю сообщение об ошибке

sqlalchemy.exc.ArgumentError: Column object 'id' already assigned to Table 'tableX

Обратите внимание, что я пробовал различные комбинации флагов таблицы: например, autoload = True, extend_existing = True и т. д. c.

Как правильно создать и передать список Column в конструктор Table?

Спасибо.

1 Ответ

0 голосов
/ 23 апреля 2020

Следуя комментариям Илья Эверила о именах, ссылках и т. Д. c Я перешел к созданию экземпляра таблицы / столбцов в методе unittest setup (). Таким образом, я не использовал повторно объекты, которые пытался заменить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...