我有一个由httprequest提供的azure函数,应该使用CoreSQL将给定的输入存储到一个cosmos集合中。代码从请求中获取数据,但是数据永远不会写入数据库。
根据我的阅读,我知道需要在function.json文件中定义从函数向外的连接。我的问题是我需要使用function.json中的值来建立数据库连接吗?
如果这样做,是否可以从azure.functions.Out对象获得它们?如果是这样,我如何在给定function.json的“ connection”字符串的情况下连接到数据库,该字符串似乎是数据库的“ PRIMARY CONNECTION STRING”。我应该只拆分连接字符串以获取我的网址和密钥吗?
或者,我可以使用函数的“应用程序设置”来传递值吗?如果是,它们是否在函数的环境中(os.getenv('xyz'))?
感谢任何指导,尤其是在Python中。
答案 0 :(得分:1)
Consider the Following example:函数从Azure Cosmos DB触发器获取文档数据,并通过使用Cosmos DB输出绑定将数据存储到Azure Cosmos DB中
functions.json
{
"scriptFile": "__init__.py",
"bindings": [
{
"type": "cosmosDBTrigger",
"name": "docs",
"direction": "in",
"leaseCollectionName": "leases",
"connectionStringSetting": "MyCosmosDBConnectionString",
"databaseName": "testdb",
"collectionName": "testcol01",
"createLeaseCollectionIfNotExists": true
},
{
"direction": "out",
"type": "cosmosDB",
"name": "outdoc",
"databaseName": "testdb",
"collectionName": "testcol02",
"leaseCollectionName": "leases",
"createLeaseCollectionIfNotExists": true,
"connectionStringSetting": "MyCosmosDBConnectionString",
"createIfNotExists": true
}
]
}
创建Cosmos数据库帐户以及数据库和集合以进行测试
创建一个Cosmos数据库帐户
COSMOSDB_ACCOUNT_NAME="azfuncv2db"
RESOURCE_GROUP="RG-azfuncv2"
az cosmosdb create \
--name $COSMOSDB_ACCOUNT_NAME \
--kind GlobalDocumentDB \
--resource-group $RESOURCE_GROUP
在创建的Cosmos DB中创建数据库和集合
# Get Key
COSMOSDB_KEY=$(az cosmosdb list-keys --name $COSMOSDB_ACCOUNT_NAME --resource-group $RESOURCE_GROUP --output tsv |awk '{print $1}')
# Create Database
az cosmosdb database create \
--name $COSMOSDB_ACCOUNT_NAME \
--db-name $DATABASE_NAME \
--key $COSMOSDB_KEY \
--resource-group $RESOURCE_GROUP
# Create a container with a partition key and provision 400 RU/s throughput.
COLLECTION_NAME="testcol01"
az cosmosdb collection create \
--resource-group $RESOURCE_GROUP \
--collection-name $COLLECTION_NAME \
--name $COSMOSDB_ACCOUNT_NAME \
--db-name $DATABASE_NAME \
--partition-key-path /name \
--throughput 400
COLLECTION_NAME="testcol02"
az cosmosdb collection create \
--resource-group $RESOURCE_GROUP \
--collection-name $COLLECTION_NAME \
--name $COSMOSDB_ACCOUNT_NAME \
--db-name $DATABASE_NAME \
--partition-key-path /name \
--throughput 400
# Create a container for leaves
# 'leaves' need to be a single collection partition
# Please see also: https://github.com/Azure/azure-functions-core-tools/issues/930
LEASES_COLLECTION_NAME="leases"
az cosmosdb collection create \
--resource-group $RESOURCE_GROUP \
--collection-name $LEASES_COLLECTION_NAME \
--name $COSMOSDB_ACCOUNT_NAME \
--db-name $DATABASE_NAME \
--throughput 400
将功能发布到云端
FUNCTION_APP_NAME="MyFunctionApp"
func azure functionapp publish $FUNCTION_APP_NAME --build-native-deps --no-bundler
添加功能应用设置
COSMOS_DB_CONNECTION="***************"
az webapp config appsettings set \
-n $FUNCTION_APP_NAME \
-g $RESOURCE_GROUP \
--settings \
MyCosmosDBConnectionString=$COSMOS_DB_CONNECTION
答案 1 :(得分:0)
我找到了答案。在我的azure函数的定义中,这是我的function.json
{
"scriptFile": "__init__.py",
"bindings": [
{
"authLevel": "anonymous",
"type": "httpTrigger",
"direction": "in",
"name": "req",
"methods": [
"get",
"post"
]
},
{
"name": "cosmos",
"type": "cosmosDB",
"direction": "out",
"ConnectionStringSetting": "CosmosDBConnection",
"databaseName": "messages",
"collectionName": "messages_1",
"createIfNotExists": true
},
{
"type": "http",
"direction": "out",
"name": "$return",
"dataType": "string"
}
]
}
它描述了三个绑定,
我与宇宙db的连接,其中
cosmos
是名字。out
ConnectionStringSettings
指向CosmosDBConnection,它被定义为函数的Connection-> Application设置。应用程序设置包含CosmosDB主连接字符串AccountEndpoint=https://....
database
是它将写入的数据库collectionName
是数据库中集合的名称用于返回http响应的http输出连接器。
在我的python代码中,我使用out
作为传入的参数并将其写入。
import azure.functions as func
from azure.cosmos import cosmos_client
def main(req: func.HttpRequest, cosmos: func.Out[func.Document]) -> func.HttpResponse:
logging.info('Python HTTP trigger function processed a request.')
# your magic
# create a dictionary, foo_bar in this case
# On the parameter passed in, named cosmos, use the set() operator
# in insert a Document, built from the dictionary
cosmos.set(func.Document.from_dict(foo_bar))
不需要其他数据库设置。它由azure处理,处理function.json文件。只需确保您function.json的ConnectionStringSetting指向保存您的连接字符串的属性即可。
更多花絮