ORM有效,声明式无效。为什么?

2024-06-02 08:38:06 发布

您现在位置:Python中文网/ 问答频道 /正文

这应该是不言自明的。我能够通过对象关系方法(ORM)公开数据库,但不能通过声明性方法。我没有实例化这个类吗?这里少了哪一步?你知道吗

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

engine = create_engine('my connection details', echo=False)
Session = sessionmaker(bind=engine)
session = Session()
Base = declarative_base()

my_table = Table('my_table', 
    Base.metadata, 
    autoload=True, 
    autoload_with=engine, 
    schema='my_schema')

class MyClass(Base):
    __tablename__ = 'my_table'
    int_col = Column(Integer, primary_key=True)
    str_col = Column(String)

>>> for stuff in session.query(my_table).all():
...     print stuff # Works perfectly

>>> for stuff in session.query(MyClass).all():
...     print stuff # DatabaseError: table or view does not exist

Tags: 方法fromimportbasesqlalchemysessionmycreate
1条回答
网友
1楼 · 发布于 2024-06-02 08:38:06

试试这个:

class MyClass(Base):
    __table__ = my_table
    int_col = Column(Integer, primary_key=True)
    str_col = Column(String)

声明性为每个映射器创建表,因此声明性中的“my\u table”是另一个表。 也可以使用数据库反射:

metadata = sqlalchemy.MetaData(bind=engine)
metadata.reflect()

class MyClass(Base):
    __table__ = metadata.tables['my_table']
    int_col = Column(Integer, primary_key=True)
    str_col = Column(String)

相关问题 更多 >