ошибка при создании одной таблицы вместо create_all - PullRequest
0 голосов
/ 24 февраля 2020

Я пытаюсь создать таблицу по требованию.

def create_host_table(name):
    """Create host server status table.

    Arguments:
        name (str): name of the host.
    """
    class HostMachineStatus(Base):
        __tablename__ = '{0}{1}{2}'.format(HOST_TABLE_PREFIX, name, HOST_TABLE_SUFFIX)
        id = Column(Integer, primary_key=True)
        status = Column(String(7)) # online or offline
        datemodified = Column('datemodified', TIMESTAMP, server_default=text(
            'CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP'
            )
        )
        datecreated= Column('datecreated', TIMESTAMP)
        status_time_delta = ('status_time_delta', TIMESTAMP) # duration how long was online or offline.
    table_name = HostMachineStatus.__tablename__
    Base.metadata.create_all(engine, Base.metadata.tables[table_name],checkfirst=True)

, но вышеприведенный код выдает ошибку:

Traceback (most recent call last):
  File "server_status.py", line 97, in <module>
    main()
  File "server_status.py", line 93, in main
    create_host_table(host)
  File "server_status.py", line 71, in create_host_table
    Base.metadata.create_all(engine, Base.metadata.tables[table_name],checkfirst=True)
  File "/home/rock64/.local/lib/python3.6/site-packages/sqlalchemy/sql/schema.py", line 4316, in create_all
    ddl.SchemaGenerator, self, checkfirst=checkfirst, tables=tables
  File "/home/rock64/.local/lib/python3.6/site-packages/sqlalchemy/engine/base.py", line 2049, in _run_visitor
    conn._run_visitor(visitorcallable, element, **kwargs)
  File "/home/rock64/.local/lib/python3.6/site-packages/sqlalchemy/engine/base.py", line 1618, in _run_visitor
    visitorcallable(self.dialect, self, **kwargs).traverse_single(element)
  File "/home/rock64/.local/lib/python3.6/site-packages/sqlalchemy/sql/visitors.py", line 138, in traverse_single
    return meth(obj, **kw)
  File "/home/rock64/.local/lib/python3.6/site-packages/sqlalchemy/sql/ddl.py", line 754, in visit_metadata
    [t for t in tables if self._can_create_table(t)]
TypeError: 'Table' object is not iterable

1 Ответ

0 голосов
/ 26 февраля 2020

Из документации (выделено мое):

таблиц - необязательно список объектов таблиц, который является подмножеством общих таблиц в метаданных (другие игнорируются) .

Итак, проблема в том, что вы пропускаете одну таблицу, а не список таблиц. («Не повторяется» в выводе ошибки также является сильной подсказкой.) Попробуйте вместо этого:

Base.metadata.create_all(engine, [Base.metadata.tables[table_name]], checkfirst=True)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...