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).
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
暂无评论内容