技术求助:如何通过数据库IP地址在Django中从Sage Evolution数据库获取账户数据并生成账户对账单与账龄分析
解决Django连接远程Sage Evolution MSSQL数据库的问题
我之前帮别人处理过类似的Django对接远程MSSQL数据库的需求,结合你提供的pymssql代码,给你梳理一下在Django框架里实现相同取数流程的具体步骤:
1. 先安装MSSQL适配的Django数据库后端
Django原生对MSSQL的支持需要依赖第三方库,推荐使用微软官方维护的mssql-django,安装命令:
pip install mssql-django
2. 配置Django的数据库连接(指定IP地址)
在你的Django项目的settings.py里修改DATABASES配置,把远程数据库的IP、账号信息填进去:
DATABASES = { 'default': { 'ENGINE': 'mssql', 'NAME': 'DB_Name', # 你的数据库名称 'USER': '[Username]_dev_ro', # 只读账号 'PASSWORD': '[Password]', 'HOST': '[IP]', # 远程数据库的IP地址 'PORT': '1433', # MSSQL默认端口,如果你的端口不一样请修改 'OPTIONS': { 'driver': 'ODBC Driver 17 for SQL Server', # 需要提前安装ODBC驱动 }, } }
注意:要确保你的服务器上已经安装了「ODBC Driver 17 for SQL Server」,不然会连接失败。
3. 用inspectdb生成数据库模型(对应现有表)
配置好连接后,你就可以用inspectdb命令自动生成对应Sage Evolution数据库表的Django模型了:
# 先查看生成的模型代码 python manage.py inspectdb # 如果确认没问题,直接写入到你的app的models.py里 python manage.py inspectdb > your_app_name/models.py
生成模型后,记得在模型类里加上managed = False,这样Django不会尝试修改或创建这些现有表:
class _etblGLAccountTypes(models.Model): # 自动生成的字段... class Meta: managed = False db_table = '_etblGLAccountTypes'
4. 实现类似pymssql的原生SQL取数流程
如果你不想用Django的ORM,想直接执行原生SQL(就像你用pymssql写的那样),可以用Django提供的connection对象来实现:
from django.db import connection def get_account_types(): # 用with语句自动管理连接和游标 with connection.cursor() as cursor: # 执行你的查询语句 cursor.execute('SELECT top 10 * FROM [DB_Name].[dbo].[_etblGLAccountTypes]') # 把结果转成字典格式(和你pymssql的as_dict=True效果一样) columns = [col[0] for col in cursor.description] results = [dict(zip(columns, row)) for row in cursor.fetchall()] # 遍历结果(和你原来的代码逻辑一致) for row in results: print(row) return results
这个方法不需要手动关闭连接,with语句会自动处理,比直接用pymssql更贴合Django的生态。
一些额外的注意事项
- 确保远程数据库的防火墙已经开放了1433端口(或者你指定的端口),允许你的Django服务器IP访问
- 确认使用的数据库账号有足够的只读权限(因为你用的是
_dev_ro账号,刚好符合需求) - Sage Evolution的数据库表结构可能比较复杂,涉及多个表的关联查询,后续做账单和账龄分析时,可以结合Django ORM的关联查询来简化代码
内容的提问来源于stack exchange,提问作者KyleStranger
相关产品推荐
相关产品推荐

