提问人:javery 提问时间:9/27/2023 最后编辑:javery 更新时间:9/27/2023 访问量:42
SQLAlchemy 仅在行中有回车符时返回列表行 (SQL Server)
SQLAlchemy Only Returns List Line if there are Carriage Returns in the Row (SQL Server)
问:
我有一个SQL查询,它生成DDL以基于现有架构创建表。我正在运行它以将架构复制到另一个数据库以进行备份。我无权在SQL Server中以正常方式执行此操作,因此我正在使用其他方式。
下面是我的查询应返回的 DDL 文本(我已验证查询是否在 SSMS 中返回);它只有一行(和列),标题名称为“DDL”:
SET NOCOUNT OFF;
IF OBJECT_ID('[<schema_name>].[<table_name>]','SN') IS NOT NULL DROP SYNONYM [<schema_name>].[<table_name>];
IF OBJECT_ID('[<schema_name>].[<table_name>]','U') IS NOT NULL DROP TABLE [<schema_name>].[<table_name>];
RAISERROR('CREATE TABLE %s',10,1, '[<schema_name>].[<table_name>]') WITH NOWAIT;
CREATE TABLE [<schema_name>].[<table_name>] (
... column definitions ...
)
RAISERROR('CREATING INDEXES OF %s',10,1, '[<schema_name>].[<table_name>]') WITH NOWAIT;
但是,sqlachemy 只返回最后一行:
RAISERROR('CREATING INDEXES OF %s',10,1, '[<schema_name>].[<table_name>]') WITH NOWAIT;
下面是围绕其拉取位置的 python 代码:
def get_create_ddls(table_name_list: list, conn) -> list:
fd = open('CreateCreateDDL.sql', 'r')
original_query = fd.read()
fd.close()
return_list = []
for name in table_name_list:
# prefixed the views as "V_"
isView = name[:2] == "V_"
if isView:
tbl_insert_str = "('" + name[2:] + "')"
else:
tbl_insert_str = "('" + name + "')"
query = original_query.replace("<INSERT_TABLE_NAME_HERE>", tbl_insert_str, 1)
result = conn.execute(sqlalchemy.text(query))
# TODO: Only reading last line of the row
value_str = ""
for row in result:
temp_value = row.DDL
value_str += temp_value
print(value_str)
if isView:
# put the "V_" back into the CREATE statement
view_name = name[2:(name.find("].[") + 3)] + "V_" + name[(name.find("].[") + 3):]
value_str = value_str.replace(name[2:], view_name)
return_list.append(value_str)
return return_list
如何在不进入并从源查询中手动删除每个回车符的情况下解决此问题?他们有很多。
答:
评论