如何从SQLAlchemy ORM会话中查询预先存在的表格?

8
我正在使用SQLAlchemy进行一些数据处理并创建一些表格。我从一个名为orm_table的表中加载数据,该表是使用Declarative BaseORMTable定义的,因此可以使用session.query(ORMTable).all()语句查询数据库。
但是,我还需要查询另一个已经存在于数据库中且未在orm中定义的表non_orm_table。如何在同一个会话中查询此表?我没有与之相关联的类,因此想知道这种情况的标准做法是什么?

你能为现有的表定义一个模型吗? - Simon
1
但是那个表已经存在,所以我希望有一种方法可以只提取我感兴趣的特定表格的信息,以便 ORM 可以处理。 - sfactor
1
看看 sqlalchemy.ext.automap. :-) - Simon
2个回答

9
这是制作它的代码片段:
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker

engine = create_engine('<db_connection_string>', echo=True)
Base = declarative_base(engine)


class NonOrmTable(Base):
    """
    eg. fields: id, title
    """
    __tablename__ = 'non_orm_table'
    __table_args__ = {'autoload': True}


def loadSession():
    """"""
    metadata = Base.metadata
    Session = sessionmaker(bind=engine)
    session = Session()
    return session


if __name__ == "__main__":
    session = loadSession()
    res = session.query(NonOrmTable).all()
    print res[1].title

关键是使用 SqlAlchemy 的 autoload 属性。它会动态地将现有的表字段名映射到类上。
希望对你有所帮助。

必须在__table_args__中使用autoload_with,但是这确实有所帮助。正是我正在寻找的。谢谢!我已经接受了你的答案。 - sfactor
是的,您仍然需要将类与现有表绑定。 - ichbinblau

3
您也可以按照以下方式进行操作。
  #Considering account is your table and first_name is a column

  from sqlalchemy import create_engine, select, MetaData, Table

  CONN = create_engine('postgresql+psycopg2://username:password@localhost:5432/dbname', 
  client_encoding="UTF-8") 
  META_DATA = MetaData(bind=CONN, reflect=True)
  account = META_DATA.tables['account']
  stmt = select([account]).where(account.columns.first_name == 'Michael')
  connection = CONN.connect()
  results = connection.execute(stmt).fetchall()

  # to print the result
  for result in results:
      print(result)

我在这里赞同使用反射方法(正如其他类似问题的答案中所指出的);非常方便!!! - Matt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接