我正在使用Pyramid Web应用程序编写的Web应用程序。使用MySQL存储关系的东西。但是网络应用程序也是一个数据存储工具,我们使用Postgres来实现这一目的。
请注意,每个用户的帐户都会在Postgres中获得自己的连接参数。运行Postgres的主机对用户来说不一样。
我们有几个存储过程对于应用程序运行至关重要。我想知道如何将程序发送到每个Postgres数据库实例。我想确保更新它们也很容易。
到目前为止,这是我能想到的。
我在应用程序的代码库中有一个名为procedures.sql
的文件CREATE FUNCTION {procedure_name_1} (text, text,
max_split integer) RETURNS text AS $$
BEGIN
-- do stuff --
END;
$$ LANGUAGE plpgsql;
CREATE FUNCTION {procedure_name_2} (text, text,
max_split integer) RETURNS text AS $$
BEGIN
-- do stuff --
END;
$$ LANGUAGE plpgsql;
每当用户想要与他的数据库通信时,我都会从python应用程序执行_add_procedures_to_db
函数。
procedure_name_map = {
'procedure_name_1': 'function_1_v1',
'procedure_name_2': 'function_2_v1'
}
def _add_procedures_to_db(connection):
cursor = connection.Cursor()
with open(PROCEDURE_FILE_PATH) as f:
sql = f.read().format(**procedure_name_map)
try:
cursor.execute(sql)
connection.commit()
except:
pass
请注意,当我们想要在MySQL DB的Web响应周期内进行一些事务时,将获得连接参数。
如果我更新了该过程的代码,则策略是将function_1_v1
更改为function_1_v2
。
但是这似乎是一种非常昂贵的方式,因为每次我想要连接时,我都会得到一个必须在第一次处理后才能处理的异常。
所以这是我的问题:
是否有其他方法可以在网络应用程序代码中执行此操作?或者我应该将过程更新作为部署和配置的一部分而不是应用层事物吗?
答案 0 :(得分:0)
如果您正在寻找如何在不同的Pyramid Web应用程序版本部署(通常称为迁移)之间更改数据库(表,视图,存储过程)。
如果您使用的是SQLAlchemy,则可以使用自动迁移工具,例如Alembic
如果您使用的是原始SQL命令,那么每次部署具有不同版本的应用程序时,都需要编写并运行自定义命令行脚本。此命令行脚本将为当前应用程序版本准备数据库。这包括运行ALTER TABLE
SQL命令等。