我有一个带if语句的f字符串,但是当我将value设置为false时,它是否留有空格?这就是我所拥有的。
from sqlalchemy.schema import DDLElement
from sqlalchemy.sql import table
from sqlalchemy.ext import compiler
class CreateView(DDLElement):
def __init__(self, name, selectable, replace=True):
self.name = name
self.selectable = selectable
self.replace = replace
@compiler.compiles(CreateView)
def complile_create_view(element, compiler, **kwargs):
replace_text = "OR REPLACE"
return (
f"""CREATE {replace_text if element.replace else ''} VIEW {element.name} """
f"""AS {compiler.sql_compiler.process(element.selectable, literal_binds=True)}"""
)
要在我的终端中对此进行测试,
from sqlalchemy import text
view_query = text("SELECT * FROM my_table")
create_view = CreateView('my_view', view_query, replace=False)
In [62]: print(str(create_view.compile()))
CREATE VIEW my_view AS SELECT * FROM my_table
如果我设置replace = True,则我的DDL很好。如何摆脱CREATE和VIEW之间的多余空间?
答案 0 :(得分:0)
我可以想到两种选择:
第一种选择是从字符串中删除空格并将其添加到替换字符串中:
f"CREATE{' ' + replace_text if element.replace else ''} VIEW {element.name}"
显然有点丑陋。或在格式化后在两个空格之间加一个空格:
f"CREATE {replace_text if element.replace else ''} VIEW {element.name}".replace(' ', ' ')
答案 1 :(得分:0)
这是在您不使用replace_text时发生的,因此只需将空格移至其值并将else
更改为输出空格而不是空即可。
@compiler.compiles(CreateView)
def complile_create_view(element, compiler, **kwargs):
replace_text = " OR REPLACE "
return (
f"""CREATE{replace_text if element.replace else ' '}VIEW {element.name} """
f"""AS {compiler.sql_compiler.process(element.selectable, literal_binds=True)}"""
)