如何使用 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 列作为文本。

注意:没有删除列的选项。