ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

写一段Python连接SQL Server数据库的代码:用TaoToken统一Key管理连接配置

写一段Python连接SQL Server数据库的代码:用TaoToken统一Key管理连接配置 1. 从一段“能跑但不敢提交”的代码说起写一段 Python 连接 SQL Server 数据库的代码本身并不难难的是这段代码怎么在本地、测试、生产三套环境里都不出事。我见过太多项目里躺着这样的片段passwordProd2024直接写死在.py文件里然后这个文件被提交进了 Git 仓库。等到要换数据库密码时全组人翻遍代码找硬编码改完还要重新走一遍发布流程。这篇就聚焦 Python 通过 pyodbc 连接 SQL Server 的完整流程核心解决两件事连接字符串里账号密码硬编码以及多环境切换繁琐。我会给出可复制的连接配置模板再演示一次查询验证连接是否成功。适合正在写数据脚本、ETL 任务、后台服务又不想把密钥散落在代码里的开发者。先说清楚 pyodbc 是什么。它是 Python 的 ODBC 桥接库让你用统一的 DB-API 接口去连 SQL Server、Oracle、PostgreSQL 等。SQL Server 官方驱动是 Microsoft ODBC Driver for SQL Serverpyodbc 负责调用它。所以你的机器上得先有驱动再装 Python 包顺序不能反。传统写法长这样import pyodbc conn pyodbc.connect( DRIVER{ODBC Driver 18 for SQL Server}; SERVER192.168.1.10,1433; DATABASEOrderDB; UIDsa; PWDMyHardCodePwd123; TrustServerCertificateyes; )这段代码能跑但问题很明显密码进了版本库换环境要改代码多人协作时谁的密码都不一样。下面我们一步步把它改造成配置与代码分离、密钥统一管理的形态。2. 用 TaoToken 统一 Key 管理连接配置要解决硬编码思路是把“连接参数”和“密钥”拆开。连接参数服务器地址、库名、端口可以放配置文件密钥账号密码交给一个统一的 Key 管理服务。TaoToken 在这里扮演的就是统一 Key 入口的角色你可以在它的控制台里创建和管理 API Key代码侧只读取一个环境变量不再出现明文密码。先做前置准备。你需要一个 TaoToken 账号然后到控制台创建 Key。入口在这里控制台https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewriteAPI Keys 管理https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite创建完 Key 后把它写进环境变量而不是写进代码。Linux/macOS 下export TAOTOKEN_API_KEYsk-你的keyWindows PowerShell$env:TAOTOKEN_API_KEYsk-你的key这里要说明一下边界TaoToken 管的是“访问凭证”这一层它不会替你去连 SQL Server也不会把你的数据库密码存进去。它的价值在于当你项目里同时有数据库连接、模型调用、第三方接口时所有 Key 都从同一个地方取轮换和审计都集中在一处而不是散落在十几个.env文件里。如果你还想在写代码时顺手验证模型调用是否正常可以用模型对话页面测一下 Key 是否生效模型对话https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_contentchatutm_campaignrewrite接入文档在这里遇到参数不确定时对照看接入文档https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewriteAPI 基础地址是https://taotoken.net/api注意这个地址不带 UTM 参数直接用于程序请求。前置做完我们进入配置环节。核心原则一句话代码里只出现“变量名”不出现“值”。3. 可复制的连接配置模板这一节给出完整可复制的配置。分三块环境变量文件、配置读取模块、连接工厂函数。先建一个.env文件不要提交到 Git记得加进.gitignore# .env TAOTOKEN_API_KEYsk-你的key SQLSERVER_HOST192.168.1.10 SQLSERVER_PORT1433 SQLSERVER_DATABASEOrderDB SQLSERVER_USERapp_user SQLSERVER_PASSWORD从TaoToken控制台获取或本地注入 SQLSERVER_DRIVERODBC Driver 18 for SQL Server如果你更习惯 JSON 配置可以这样组织路径放在config/db.json{ sqlserver: { driver: ODBC Driver 18 for SQL Server, host: 192.168.1.10, port: 1433, database: OrderDB, user: app_user, encrypt: yes, trust_server_certificate: yes }, taotoken: { base_url: https://taotoken.net/api, api_key_env: TAOTOKEN_API_KEY } }然后是读取配置的模块db_config.pyimport os from dataclasses import dataclass dataclass class SQLServerConfig: driver: str host: str port: int database: str user: str password: str encrypt: str yes trust_server_certificate: str yes def to_connection_string(self) - str: return ( fDRIVER{{{self.driver}}}; fSERVER{self.host},{self.port}; fDATABASE{self.database}; fUID{self.user}; fPWD{self.password}; fEncrypt{self.encrypt}; fTrustServerCertificate{self.trust_server_certificate}; ) def load_config() - SQLServerConfig: return SQLServerConfig( driveros.environ.get(SQLSERVER_DRIVER, ODBC Driver 18 for SQL Server), hostos.environ[SQLSERVER_HOST], portint(os.environ.get(SQLSERVER_PORT, 1433)), databaseos.environ[SQLSERVER_DATABASE], useros.environ[SQLSERVER_USER], passwordos.environ[SQLSERVER_PASSWORD], )注意to_connection_string里DRIVER外面包了一层花括号这是 ODBC 连接字符串的语法要求驱动名里有空格时必须这么写否则会报驱动找不到。接着是连接工厂db.pyimport pyodbc from contextlib import contextmanager from db_config import load_config contextmanager def get_connection(): cfg load_config() conn pyodbc.connect(cfg.to_connection_string(), timeout10) try: yield conn finally: conn.close()用上下文管理器是为了保证连接一定被关闭避免连接泄漏。到这里代码里已经没有任何明文密码了密码只存在于环境变量或 TaoToken 统一注入的运行时环境中。如果你在做长期编码或 Agent 类项目需要把这类配置管理固化下来可以了解下 Coding PlanCoding Planhttps://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite4. 验证请求跑一次查询确认连接成功配置写好了得验证。写一个check_conn.pyfrom db import get_connection def main(): with get_connection() as conn: cursor conn.cursor() cursor.execute(SELECT VERSION AS version, DB_NAME() AS db) row cursor.fetchone() print(SQL Server 版本:, row.version.splitlines()[0]) print(当前数据库:, row.db) cursor.execute(SELECT TOP 3 name FROM sys.tables ORDER BY name) for r in cursor.fetchall(): print(表:, r.name) if __name__ __main__: main()运行python check_conn.py预期输出类似SQL Server 版本: Microsoft SQL Server 2022 (RTM) - 16.0.1000.6 当前数据库: OrderDB 表: OrderDetail 表: Orders 表: Users看到版本号和表名说明连接字符串、驱动、账号密码全部正确。如果这一步失败先别急着改代码对照下一节的报错排查。再补一个带参数的查询示例演示如何安全地传参避免 SQL 注入with get_connection() as conn: cursor conn.cursor() cursor.execute( SELECT OrderId, Amount FROM Orders WHERE UserId ? AND Status ?, (1001, paid), ) for order_id, amount in cursor.fetchall(): print(order_id, amount)pyodbc 用?占位符参数以元组传入不要用 f-string 拼 SQL。这是很多人踩过的坑拼字符串不仅危险遇到日期和字符串类型还容易出错。5. 本篇常见报错排查连接 SQL Server 的报错大多集中在驱动、认证、网络三类。下面按真实报错逐条对照。报错一pyodbc.Error: (01000, [01000] [unixODBC][Driver Manager]Cant open lib ODBC Driver 18 for SQL Server)这是 Linux 上最常见的。原因是驱动没装或者驱动名写错。先确认已安装odbcinst -q -d如果列表里没有ODBC Driver 18 for SQL Server需要安装微软官方驱动。安装后驱动名必须和连接字符串里完全一致大小写和空格都不能差。报错二Login failed for user app_user. (18456)账号密码错误或者该账号没有访问目标库的权限。检查环境变量SQLSERVER_USER和SQLSERVER_PASSWORD是否被正确加载。可以在代码里临时打印os.environ.get(SQLSERVER_USER)确认但千万别打印密码。报错三[HYT00] [Microsoft][ODBC Driver 18 for SQL Server]Login timeout expired网络不通或端口不对。先用telnet 192.168.1.10 1433测端口。SQL Server 默认端口 1433如果实例用了动态端口需要在连接字符串里写成SERVERhost\\instance形式或者去 SQL Server 配置管理器里固定端口。报错四SSL Provider: The certificate chain was issued by an authority that is not trusted这是 ODBC Driver 18 默认开启加密导致的。开发环境可以用TrustServerCertificateyes绕过生产环境建议配置受信任证书而不是长期关闭校验。报错五local proxy failed或401 Unauthorized如果你在代码里同时调用了 TaoToken 的 API出现 401 通常是 Key 没读到或已失效。检查TAOTOKEN_API_KEY环境变量是否存在以及 Key 是否在控制台被禁用。local proxy failed一般是本地网络或代理配置问题确认请求地址是https://taotoken.net/api不要多加路径。报错六AttributeError: module pyodbc has no attribute connect这种多半是文件命名冲突。如果你把测试文件命名成了pyodbc.pyPython 会导入你自己的文件而不是库。改个名字即可。报错七reading choices相关解析错误这类通常出现在你调用模型接口返回结构解析时说明返回体不是预期的 JSON。先打印原始响应文本确认是不是被网关拦截返回了 HTML。对照接入文档检查请求头和 body 格式。排查顺序建议固定下来先确认驱动再确认网络端口再确认账号权限最后看加密和证书。按这个顺序走九成问题能定位。6. 把 Key 管理固化到你的工作流代码能跑通只是第一步真正省心的是把 Key 管理变成习惯。我的做法是所有密钥类信息一律走环境变量或统一 Key 服务配置文件只放非敏感参数.env永远在.gitignore里。团队协作时新同学拉下代码只需要在本地注入自己的 Key不用改任何一行代码。如果你项目里还有 Claude Code 这类编码工具需要接入配置三件套要写全Base URL 填https://taotoken.net/apiKey 用控制台创建的 KeyModel ID 按文档填写。三者缺一工具就会报认证或模型不存在。Claude Code 接入https://taotoken.net/claudecode-anthropic?utm_sourcetaotoken_aicg_blog_endutm_contentclaudecode-anthropicutm_campaignrewrite回到最开始那段硬编码的代码现在它变成了配置读取加连接工厂密码从代码里彻底消失。下次换数据库密码你只需要在 TaoToken 控制台或环境变量里改一处所有环境同步生效不用再翻代码、不用重新发布。这才是“写一段连接代码”背后真正值得花时间的地方。
返回列表