sqlite SQLAlchemy将表名更改为具有两个下划线

tvz2xvvm  于 2023-02-13  发布在  SQLite
关注(0)|答案(2)|浏览(198)

在我的Flask/SQLAlchemy项目中,我有一个名为Styles_Index的索引表,它有一个对应的表对象供我查询。

CREATE TABLE Styles_Index
(
    beer_id integer not null, 
    style_id integer not null, 
    primary key (beer_id, style_id)
);

python中的对象看起来像

class Styles_Index(db.Model):
    beer_id = db.Column(db.Integer, db.ForeignKey('beers.id'),
            primary_key = True)
    style_id = db.Column(db.Integer, db.ForeignKey('styles.id'),
            primary_key = True)

当我尝试通过SQLAlchemy BaseQuery.join()将表连接到另一个共享公共键的表上时,它会创建一个查询:

SELECT styles__index.id AS styles__index_id, 
    styles__index.beer_id AS styles__index_beer_id, 
    styles__index.style_id AS styles__index_style_id
    FROM styles__index JOIN styles ON styles__index.style_id = styles.id
    LIMIT ? OFFSET ?

其中Styles_Index有两个下划线,而不是一个。这是否是由于SQL中的_通配符而有意设计的选择?是否有更好的方法来编写此查询,而不必诉诸于编写原始SQL?

e5nqia27

e5nqia271#

需要说明的是,使用PEP8特定的名称(如MyClassName)不会有这样的问题。

of1yzvn4

of1yzvn42#

如果模型类上既没有定义__tablename__也没有定义__table__,则Flask-SQLAlchemy将根据模型类名自动生成表名。
生成函数(camel_to_snake_case)使用正则表达式替换(link),在某些内部大写字母之前插入下划线,然后将结果小写。因此,在内部大写字母之前带有下划线的类名将导致名称包含双下划线。

相关问题