在 SQLAlchemy 中获取表名

问题描述 投票:0回答:3
from sqlalchemy import create_engine

from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column,Integer,String
from sqlalchemy.orm import sessionmaker

engine = create_engine('mysql://we0:go@wecom/javadb', convert_unicode=True, echo=False)
try:
   engine.execute("use javadb")
   engine.connect()
   print 'connected'
except:
   print 'error'

Base = declarative_base()

Session = sessionmaker(bind=engine)

session = Session()

print engine.table_names()
print Base.metadata.tables
#print Base.metadata.reflect(engine)
class MontEmp(Base):
    __table__ = Base.metadata.tables['MONTGOMERY_EMPLOYEE']

for item in session.query(MontEmp.id):
        print item

我试图从现有数据库获取表名并查询它,但当我尝试通过 - Base.metadata.tables['MONTGOMERY_EMPLOYEE'] 访问表时出现错误,出现关键错误。

当我打印 Base.metadata.tables 时它是空的,但是当我打印 engine.table_names() 时它会列出所有表。

问题:-

为什么 Base.metadata.tables['MONTGOMERY_EMPLOYEE'] 为空?

python mysql sqlalchemy
3个回答
9
投票

我遇到了同样的问题,这就是我解决它的方法。

from sqlalchemy.schema import MetaData
from sqlalchemy import create_engine

engine = create_engine(config.DATABASE_URL)
meta = MetaData()
meta.reflect(bind=engine)

meta.tables.keys()   <== this is what we were looking for

2
投票

查看 SqlAlchemy 1.0 中新的 automap 功能

根据文档中的示例,如果表名称为

MONTGOMERY_EMPLOYEE
,您应该能够使用以下代码段创建一个类:

Base = automap_base()
Base.prepare(engine, reflect=True)

MontEmp = Base.classes.MONTGOMERY_EMPLOYEE

然后应该可以像任何手动表达的 SqlAlchemy 类一样查询类

MontEmp

Base.metadata.tables['MONTGOMERY_EMPLOYEE'] 

为空,因为这是一个

declarative_base
并且数据库尚未反映。


0
投票

从 sqlalchemy 2.0 开始 -

from sqlalchemy import create_engine
from sqlalchemy import MetaData

metadata_obj = MetaData()

# create an engine
engine = create_engine("db_url")
metadata_obj.reflect(bind=engine)

# print table names
print(metadata_obj.tables.keys())

将为您提供表的名称:

dict_keys

© www.soinside.com 2019 - 2024. All rights reserved.