在我的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?
2条答案
按热度按时间e5nqia271#
需要说明的是,使用PEP8特定的名称(如MyClassName)不会有这样的问题。
of1yzvn42#
如果模型类上既没有定义
__tablename__
也没有定义__table__
,则Flask-SQLAlchemy将根据模型类名自动生成表名。生成函数(camel_to_snake_case)使用正则表达式替换(link),在某些内部大写字母之前插入下划线,然后将结果小写。因此,在内部大写字母之前带有下划线的类名将导致名称包含双下划线。