如何使用 Gramex FormHandler 动态创建或更改数据库模式(在 运行 时间)
How to create or alter a DB schema dynamically (at run time) using Gramex FormHandler
我希望能够(在 运行 时间)使用 Gramex 的 FormHandler 微服务在特定事件(例如单击按钮)上动态创建或更改数据库模式。
您可以使用 FormHandler 的查询函数来完成,它可以根据 url 中传递的查询参数修改查询。
参考下面的link了解更多
https://gramener.com/gramex/guide/formhandler/#formhandler-queryfunction
你应该试试这个:
在您的 yaml 处理程序中:
queryfunction: mymodule.sales_query(args)
在您的 python 代码中:
def sales_query(args):
cities = args.get('ct', [])
if len(cities) > 0:
vals = ', '.join("'%s'" % pymysql.escape_string(v) for v in cities)
return 'SELECT * FROM sales WHERE city IN (%s)' % vals
else:
return 'SELECT * FROM sales'
参考资料来自:
https://gramener.com/gramex/guide/formhandler/#formhandler-queryfunction
FormHandler 支持 defining columns in the spec.
例如,此配置创建一个名为 profile
的 table,其中包含 4 列:用户、密码、年龄和 ID。
url:
handler: FormHandler
kwargs:
url: 'postgresql://$USER:$PASS@server/db' # Pick any database
table: profile # Pick any table name to create
id: id # The "id" column is primary key
# Define your table's columns
columns:
user: TEXT # Use any SQL type allowed by DB
password: VARCHAR(40) # including customizations
age:
type: INTEGER # You can also specify as a dict
nullable: true # Allows NULL values for this field
default: 0 # that default to zero
id:
type: INTEGER # Define an integer ID column
primary_key: true # as a primary key
autoincrement: true # that auto-increments
但是如果这需要在运行时更改,例如当用户点击按钮时,您可以使用 FunctionHandler with gramex.data.alter()
例如,将此添加到您的 gramex.yaml
:
url:
alter:
pattern: /alter
handler: FunctionHandler
kwargs:
# You can decide the columns dynamically here
function: >
gramex.data.alter(url, table, columns={
col: 'TEXT' for col in handler.args.get('col', [])
})
调用 /alter?col=email
时,该函数会添加一个 email
列作为文本。
注意:没有删除列的选项。
我希望能够(在 运行 时间)使用 Gramex 的 FormHandler 微服务在特定事件(例如单击按钮)上动态创建或更改数据库模式。
您可以使用 FormHandler 的查询函数来完成,它可以根据 url 中传递的查询参数修改查询。
参考下面的link了解更多 https://gramener.com/gramex/guide/formhandler/#formhandler-queryfunction
你应该试试这个:
在您的 yaml 处理程序中:
queryfunction: mymodule.sales_query(args)
在您的 python 代码中:
def sales_query(args):
cities = args.get('ct', [])
if len(cities) > 0:
vals = ', '.join("'%s'" % pymysql.escape_string(v) for v in cities)
return 'SELECT * FROM sales WHERE city IN (%s)' % vals
else:
return 'SELECT * FROM sales'
参考资料来自: https://gramener.com/gramex/guide/formhandler/#formhandler-queryfunction
FormHandler 支持 defining columns in the spec.
例如,此配置创建一个名为 profile
的 table,其中包含 4 列:用户、密码、年龄和 ID。
url:
handler: FormHandler
kwargs:
url: 'postgresql://$USER:$PASS@server/db' # Pick any database
table: profile # Pick any table name to create
id: id # The "id" column is primary key
# Define your table's columns
columns:
user: TEXT # Use any SQL type allowed by DB
password: VARCHAR(40) # including customizations
age:
type: INTEGER # You can also specify as a dict
nullable: true # Allows NULL values for this field
default: 0 # that default to zero
id:
type: INTEGER # Define an integer ID column
primary_key: true # as a primary key
autoincrement: true # that auto-increments
但是如果这需要在运行时更改,例如当用户点击按钮时,您可以使用 FunctionHandler with gramex.data.alter()
例如,将此添加到您的 gramex.yaml
:
url:
alter:
pattern: /alter
handler: FunctionHandler
kwargs:
# You can decide the columns dynamically here
function: >
gramex.data.alter(url, table, columns={
col: 'TEXT' for col in handler.args.get('col', [])
})
调用 /alter?col=email
时,该函数会添加一个 email
列作为文本。
注意:没有删除列的选项。