【问题标题】:Get Table Name By Table Class In Sqlalchemy在 Sqlalchemy 中按表类获取表名
【发布时间】:2014-01-23 07:00:26
【问题描述】:

我想把一个类传给一个函数,不想再传名字了。

class TableClass(Base):
    __table__ = Table('t1', metadata, autoload=True)
def get_name(TableClass):
    print TableClass.GetTableName()  # print 't1'
get_name(TableClass)

所以,我用谷歌搜索,没有答案。

【问题讨论】:

    标签: python sqlalchemy


    【解决方案1】:

    根据:

    How to discover table properties from SQLAlchemy mapped object

    我可以用这个:

    print TableClass.__table__.name
    

    【讨论】:

      【解决方案2】:

      不管你是否使用声明式扩展,你可以使用Runtime Inspection API

      def get_name(TableClass):
          from sqlalchemy import inspect
          mapper = inspect(TableClass)
          print mapper.tables[0].name
      

      请注意,一个类可以有多个映射到它的表,例如在使用Inheritance 时。

      【讨论】:

        【解决方案3】:
        print TableClass.__tablename__
        

        为我工作

        【讨论】:

        • 如果您需要字符串中的表名,这将不起作用,因为它将返回 使用 str((cls.__table__.name))) 代替。
        【解决方案4】:

        在 SQLAlchemy 中,您可以使用表类属性获取表信息。

        在你的例子中

        print TableClass.__tablename__ # Prints 't1'

        根据@Aylwyn Lake 的发现

        print TableClass.__table__.name
        

        【讨论】:

        • type object 'TableClass' has no attribute '__tablename__'
        • 是的,你是对的。但是当您使用基类创建表类时它会起作用。如前所述here
        • 这假定用户在设置他们的代码时使用__tablename__ 属性进行映射,虽然有时是这样,但问题中的代码不是这样设置的。
        • @MarkHildreth:不对。所以创建Table Class的方法有两种:一种是__table__;另一个是__tablename__
        【解决方案5】:

        没有一个答案对我有用。

        这样做了:

        对于类对象:

        TableClass.sa_class_manager.mapper.mapped_table.name
        

        对于实例对象:

        tableObj.sa_instance_state.mapper.mapped_table.name
        

        【讨论】:

          【解决方案6】:

          我自己也遇到了这个问题,传递了对象,也不想传递表名的字符串..

          原来,它只是 Table 对象的一个​​属性,例如:

          table = new Table("somename",meta)
          
          ...
          print("My table is called: " + table.name)
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-09-22
            • 1970-01-01
            • 2016-12-20
            • 2014-09-17
            • 2018-01-25
            • 1970-01-01
            • 2018-07-29
            • 1970-01-01
            相关资源
            最近更新 更多