Is ‘__tablename__’ Compulsory in SQLAlchemy? Can We Change It?

Is __tablename__ Compulsory in SQLAlchemy? Can We Change It?

No, __tablename__ is not compulsory, but it is highly recommended in SQLAlchemy when using the ORM (Object-Relational Mapping).


READ complete article on this

What Does __tablename__ Do?

When you define a model in SQLAlchemy like this:

<span>class</span> <span>User</span><span>(</span><span>Base</span><span>):</span>
<span>__tablename__</span> <span>=</span> <span>"</span><span>users</span><span>"</span> <span># Defines the table name </span>
<span>id</span> <span>=</span> <span>Column</span><span>(</span><span>Integer</span><span>,</span> <span>primary_key</span><span>=</span><span>True</span><span>,</span> <span>index</span><span>=</span><span>True</span><span>)</span>
<span>email</span> <span>=</span> <span>Column</span><span>(</span><span>String</span><span>,</span> <span>unique</span><span>=</span><span>True</span><span>,</span> <span>index</span><span>=</span><span>True</span><span>,</span> <span>nullable</span><span>=</span><span>False</span><span>)</span>
<span>hashed_password</span> <span>=</span> <span>Column</span><span>(</span><span>String</span><span>,</span> <span>nullable</span><span>=</span><span>False</span><span>)</span>
<span>class</span> <span>User</span><span>(</span><span>Base</span><span>):</span>
    <span>__tablename__</span> <span>=</span> <span>"</span><span>users</span><span>"</span>  <span>#  Defines the table name </span>
    <span>id</span> <span>=</span> <span>Column</span><span>(</span><span>Integer</span><span>,</span> <span>primary_key</span><span>=</span><span>True</span><span>,</span> <span>index</span><span>=</span><span>True</span><span>)</span>
    <span>email</span> <span>=</span> <span>Column</span><span>(</span><span>String</span><span>,</span> <span>unique</span><span>=</span><span>True</span><span>,</span> <span>index</span><span>=</span><span>True</span><span>,</span> <span>nullable</span><span>=</span><span>False</span><span>)</span>
    <span>hashed_password</span> <span>=</span> <span>Column</span><span>(</span><span>String</span><span>,</span> <span>nullable</span><span>=</span><span>False</span><span>)</span>
class User(Base): __tablename__ = "users" # Defines the table name id = Column(Integer, primary_key=True, index=True) email = Column(String, unique=True, index=True, nullable=False) hashed_password = Column(String, nullable=False)

Enter fullscreen mode Exit fullscreen mode

  • The __tablename__ sets the name of the table in the database.
  • Without it, SQLAlchemy will automatically generate a table name based on the class name.

What Happens If We Don’t Use __tablename__?

If you don’t define __tablename__, SQLAlchemy will autogenerate a name based on the class.

Example Without __tablename__:

<span>class</span> <span>User</span><span>(</span><span>Base</span><span>):</span>
<span>id</span> <span>=</span> <span>Column</span><span>(</span><span>Integer</span><span>,</span> <span>primary_key</span><span>=</span><span>True</span><span>,</span> <span>index</span><span>=</span><span>True</span><span>)</span>
<span>email</span> <span>=</span> <span>Column</span><span>(</span><span>String</span><span>,</span> <span>unique</span><span>=</span><span>True</span><span>,</span> <span>index</span><span>=</span><span>True</span><span>,</span> <span>nullable</span><span>=</span><span>False</span><span>)</span>
<span>hashed_password</span> <span>=</span> <span>Column</span><span>(</span><span>String</span><span>,</span> <span>nullable</span><span>=</span><span>False</span><span>)</span>
<span>class</span> <span>User</span><span>(</span><span>Base</span><span>):</span>
    <span>id</span> <span>=</span> <span>Column</span><span>(</span><span>Integer</span><span>,</span> <span>primary_key</span><span>=</span><span>True</span><span>,</span> <span>index</span><span>=</span><span>True</span><span>)</span>
    <span>email</span> <span>=</span> <span>Column</span><span>(</span><span>String</span><span>,</span> <span>unique</span><span>=</span><span>True</span><span>,</span> <span>index</span><span>=</span><span>True</span><span>,</span> <span>nullable</span><span>=</span><span>False</span><span>)</span>
    <span>hashed_password</span> <span>=</span> <span>Column</span><span>(</span><span>String</span><span>,</span> <span>nullable</span><span>=</span><span>False</span><span>)</span>
class User(Base): id = Column(Integer, primary_key=True, index=True) email = Column(String, unique=True, index=True, nullable=False) hashed_password = Column(String, nullable=False)

Enter fullscreen mode Exit fullscreen mode

Generated Table Name: "user" (lowercase version of the class name)


Can We Change __tablename__?

Yes! You can change it to any valid table name.

Example with a Custom Table Name:

<span>class</span> <span>User</span><span>(</span><span>Base</span><span>):</span>
<span>__tablename__</span> <span>=</span> <span>"</span><span>my_custom_users_table</span><span>"</span> <span># Custom table name </span>
<span>id</span> <span>=</span> <span>Column</span><span>(</span><span>Integer</span><span>,</span> <span>primary_key</span><span>=</span><span>True</span><span>,</span> <span>index</span><span>=</span><span>True</span><span>)</span>
<span>email</span> <span>=</span> <span>Column</span><span>(</span><span>String</span><span>,</span> <span>unique</span><span>=</span><span>True</span><span>,</span> <span>index</span><span>=</span><span>True</span><span>,</span> <span>nullable</span><span>=</span><span>False</span><span>)</span>
<span>hashed_password</span> <span>=</span> <span>Column</span><span>(</span><span>String</span><span>,</span> <span>nullable</span><span>=</span><span>False</span><span>)</span>
<span>class</span> <span>User</span><span>(</span><span>Base</span><span>):</span>
    <span>__tablename__</span> <span>=</span> <span>"</span><span>my_custom_users_table</span><span>"</span>  <span>#  Custom table name </span>
    <span>id</span> <span>=</span> <span>Column</span><span>(</span><span>Integer</span><span>,</span> <span>primary_key</span><span>=</span><span>True</span><span>,</span> <span>index</span><span>=</span><span>True</span><span>)</span>
    <span>email</span> <span>=</span> <span>Column</span><span>(</span><span>String</span><span>,</span> <span>unique</span><span>=</span><span>True</span><span>,</span> <span>index</span><span>=</span><span>True</span><span>,</span> <span>nullable</span><span>=</span><span>False</span><span>)</span>
    <span>hashed_password</span> <span>=</span> <span>Column</span><span>(</span><span>String</span><span>,</span> <span>nullable</span><span>=</span><span>False</span><span>)</span>
class User(Base): __tablename__ = "my_custom_users_table" # Custom table name id = Column(Integer, primary_key=True, index=True) email = Column(String, unique=True, index=True, nullable=False) hashed_password = Column(String, nullable=False)

Enter fullscreen mode Exit fullscreen mode

Now the table name will be: my_custom_users_table


When Should We Use __tablename__?

Scenario Should You Use __tablename__?
You want full control over table names Yes
You follow strict database naming rules Yes
You are fine with autogenerated names No (optional)

Final Answer:

  • __tablename__ is not required, but recommended.
  • You can change the table name to anything valid.
  • If you don’t define it, SQLAlchemy will use the lowercase class name as the table name.

原文链接:Is ‘__tablename__’ Compulsory in SQLAlchemy? Can We Change It?

© 版权声明
THE END
喜欢就支持一下吧
点赞13 分享
Those who fly solo have the strongest wings.
那些单独飞翔的人拥有最强大的翅膀
评论 抢沙发

请登录后发表评论

    暂无评论内容