как исправить проблему, из-за которой engine.table_names () ничего не возвращает, но на самом деле таблица существует

#python #sqlalchemy

#python #sqlalchemy

Вопрос:

Я долго копался в этой проблеме, хотя есть много сообщений об этом, но, похоже, ни одно из них не является полезным.

У меня есть эта часть кода:

 >>> metadata = MetaData()
>>> engine = create_engine('mysql mysqlconnector://root:******@10.**.**.**:4406/metrics')
>>> engine.table_names()
[]
>>> metadata
MetaData(bind=None)
>>> metadata.reflect(bind=engine)
>>> metadata
MetaData(bind=None)
>>> engine
Engine(mysql mysqlconnector://root:***@10.**.**.**:4406/metrics)
>>> metadata.sorted_tables
[]
>>> engine.execute('show tables').fetchall()
[(bytearray(b'TableName1'),), (bytearray(b'TableName2'),), (bytearray(b'TableName3'),), (bytearray(b'TableName4'),), (bytearray(b'TableName5'),), (bytearray(b'TableName6'),), (bytearray(b'TableName7'),), (bytearray(b'TableName8'),), (bytearray(b'TableName9'),), (bytearray(b'TableName10'),), (bytearray(b'TableName11'),), (bytearray(b'TableName12'),), (bytearray(b'TableName13'),), (bytearray(b'TableName14'),), (bytearray(b'TableName15'),), (bytearray(b'TableName16'),), (bytearray(b'TableName17'),), (bytearray(b'TableName18'),), (bytearray(b'TableName19'),)]
  

как это исправить?

Это ссылка на sqlconnector?

Комментарии:

1. Я не могу воспроизвести. Добавьте echo=True к вашему create_engine вызову, и при выполнении engine.table_names() выдает ли это SHOW FULL TABLES FROM metrics запрос?

2. @SuperShoot, вот результат: 2019-03-29 12:40:33,975 INFO sqlalchemy.engine.base. Движок ПОКАЗЫВАЕТ ПОЛНЫЕ ТАБЛИЦЫ ОТ metrics 2019-03-29 12:40:33,975 INFO sqlalchemy.engine.base. Engine {} []

3. Если вы самостоятельно выполните команду show full tables через движок: engine.execute('SHOW FULL TABLES FROM metrics').fetchall() она тоже пустая?

4. @SuperShoot, в моем сообщении с вопросом я уже опубликовал вывод «показать таблицы». Она не пуста.

5. Смысл был в том, чтобы отразить точно такой же SHOW FULL TABLES FROM metrics запрос, который выполняет sqla, но ничего не возвращает, поскольку это запрос, который SQLAlchemy использует для получения имен таблиц, а не SHOW TABLES то, что вы включили в свой вопрос. Всего наилучшего в поиске ответа.

Ответ №1:

У меня был тот же вывод «[ ]» при использовании engine.table_names() . Чтобы исправить это, вы должны предоставить «схему» в качестве параметра MetaData(). Ниже приведена простая функция, которую я создал для получения списка таблиц моей базы данных:

 def get_tables(engine, schema):
  metadata = MetaData(schema = schema)
  metadata.reflect(bind=engine)
  tables = []
  for table in metadata.tables:
      table_name = table.replace(f'{schema}.', '')
      tables.append(table_name)
  return tables