首页 > 编程问答 >Python Django,使用外部MSSQL数据库

Python Django,使用外部MSSQL数据库

时间:2024-08-07 04:51:03浏览次数:16  
标签:python sql-server django pyodbc

我正在尝试创建一个连接到外部 MSSQL 数据库以仅检索信息(只读)的 django 网站。这个数据库非常庞大,有数百个表。

我目前可以通过在 django 应用程序中创建一个函数来使其工作,该函数使用 connectionString 并运行原始 SQL 查询并将其返回到 pandas 数据帧中。

不知何故,我感觉这不是 Django 应该使用的方式。您能指导我如何以正确的 Django 方式执行此操作吗?我想我需要使用模型?但这是一个外部数据库,我不想向其中写入任何内容。我也不想在我的模型中定义所有表名称,但如果必须的话我会这样做。您能否指导我如何解决此问题,同时确保数据库保持只读状态?

如何构建我的settings.py,如何构建我的models.py,如何构建我的视图。 py 能够与数据库交互吗?

import pyodbc
import pandas as pd

def SQL_to_df(driver,server,database,user,password,query):
    connectionString = pyodbc.connect(f"Driver={driver};Server{server};Database={database};UID={user};PWD={password};")
    df = pd.read_sql(query, connectionString)
    return df

你对在 Django 中使用外部 MSSQL 数据库的直觉是正确的。直接执行原始 SQL 查询虽然有效,但并不理想。 Django 的 ORM 为与数据库交互提供了更强大、更安全的方式。

以下是如何以“Django 方式”执行此操作的方法,并确保的数据库保持只读状态:

1. 安装 sqlalchemy django-pyodbc-azure

bash pip install sqlalchemy django-pyodbc-azure

2. 配置 settings.py

```python DATABASES = { 'default': { 'ENGINE': 'sql_server.pyodbc', 'NAME': 'your_database_name', 'HOST': 'your_server_address', 'USER': 'your_username', 'PASSWORD': 'your_password', 'OPTIONS': { 'driver': 'ODBC Driver 17 for SQL Server', # 或任何适合的驱动程序 'MARS_Connection': 'True', } } }

INSTALLED_APPS = [ # ...其他应用程序... 'sqlserver_ado', ] ```

3. 创建 Django 模型(使用检查自省):

Django 提供了一种从现有数据库生成模型的机制,称为“检查自省”。

bash python manage.py inspectdb --database=default > your_app/models.py

这将在的应用程序的 models.py 文件中创建数据库表结构的表示形式。可能需要对其进行调整以满足的需求。

4. 使模型只读(可选但推荐):

可以通过以下两种方法之一使模型只读:

a. managed 属性:

 在每个模型的 Meta 类中,设置 `managed = False`。这告诉 Django 不要尝试管理这些表的创建、修改或删除。

 ```python
 class YourModel(models.Model):
     # ...你的字段...

     class Meta:
         managed = False 
 ```

b. 数据库路由:

 对于更精细的控制(例如,如果需要对某些表进行写操作),可以使用数据库路由。在 `settings.py` 中:

 ```python
 DATABASE_ROUTERS = ['your_app.routers.ReadOnlyRouter']

 class ReadOnlyRouter:
     def db_for_read(self, model, **hints):
         return 'default'  # 使用的只读数据库别名

     def db_for_write(self, model, **hints):
         return None  # 禁止写入此数据库

     def allow_migrate(self, db, app_label, model_name=None, **hints):
         return False  # 禁止迁移
 ```

5. 在视图中使用模型:

现在可以像使用任何其他 Django 模型一样使用的模型,但要记住,它们是只读的:

```python from your_app.models import YourModel

def your_view(request): data = YourModel.objects.all() # 获取所有数据 # ... 对数据执行操作 ... context = {'data': data} return render(request, 'your_template.html', context) ```

重要说明:

  • 性能: 从大型数据库中检索所有数据可能效率低下。考虑使用 Django 的 ORM 方法(如 filter values select_related prefetch_related )来优化查询。

  • 安全性: 切勿将数据库凭据直接存储在代码中。改用环境变量或 Django 的安全配置方法。

标签:python,sql-server,django,pyodbc
From: 78840959

相关文章

  • 使用 Python 中的 Matplotlib 和时间序列索引生成奇怪的图
    我正在尝试使用Python中的Matplotlib绘制一些时间序列数据,但生成的图看起来很奇怪,我不明白为什么。这是我正在使用的代码:filtered_df=df.loc[(df.index>'2010-01-01')&(df.index<='2010-01-08')]#Plottingthedatafig,axs=plt.subplots(1,1,figsize=(12,......
  • Dash Python:通过 @callback 链接选项卡
    这个问题是下面链接的问题的扩展:DashPython:布局函数中的@Callback未被调用我有一个简单的数据框:importpandasaspddf=pd.DataFrame({'Class1':[1,2,3,4,5],'Class2':[6,7,8,9,10]})我创建了一个数据提取函数,该函数根......
  • 如何在 Python 中使用 Langchain 返回已使用的上下文以进行回答
    我已经构建了一个像这样的RAG系统:defformat_docs(docs):return"\n\n".join(doc.page_contentfordocindocs)response_schemas=[ResponseSchema(name="price",description="Price",type="float"),ResponseSchema(......
  • 如何从 python socket.sendmsg 获取套接字 Tx 时间戳
    在阅读此处、此处和此处时,我发现在Linux系统上,您可以通过设置套接字选项来请求接收和传输的数据包的时间戳。我目前可以使用SO_TIMESTAMPNS和SO_TIMESTAMPING来通过recvmsg获取Rx时间戳。使用sendmsg我不知道......
  • Python 类型注释中“|”两边是否“强制”使用空格?
    “Union运算符”|没有出现在PEP8的其他建议中的“始终被空格包围的运算符”列表中因此,应该可以将其样式设置为类似于算术运算符,并删除圆括号、方括号内的空格,或者如果该运算符比表达式中的其他运算符具有更高的优先级。在我看来,删除空格可以提高表达式......
  • ArcPro (3.2+) Python 脚本工具中从 .atbx Toolbox 相对导入本地模块
    我设置了一个库和关联的ArcGISToolbox,以便:/root├──Toolbox.atbx├──mylib│└──my_function.py├──my_tools│└──my_gp_script.py我将代码存储库的开发克隆保存在公司共享服务器上的一个位置,并在GitHub上托管一份副本。当我进行更新时,我会......
  • Python vs. R:揭秘机器学习领域的双璧
    一、引言1.1背景介绍随着大数据和人工智能技术的飞速发展,机器学习已经成为了一个热门领域。在机器学习领域,Python和R是两种广泛使用的编程语言。Python因其简洁易读的语法和强大的库支持,成为了最受欢迎的编程语言之一。而R则以其强大的统计分析和数据可视化能力,在统计学......
  • Windows10 安装编译后的 pysqlcipher3-1.2.1 基于 Python 3.8.10
    Windows10安装编译后的pysqlcipher3-1.2.1基于Python3.8.10本文主要是将直接安装编译后的文件,不一定的成功,但是可以尝试使用,若无法直接安装,请参考编译过程,自行编译安装,编译过程见这里安装pysqlcipher3这里用32位举例因为64位安装完全相同,只需要把对应的位数换成64......
  • 【Python】Python基础语法知识点汇集
    Python是一种高级的、解释型的编程语言,以其清晰的语法和代码可读性而闻名。本篇文章将汇集Python编程的基础语法知识点,为初学者提供一个全面的学习指南。......
  • 启动Python 的内置服务器访问本地图片
    要使用Python的内置服务器访问本地图片并正确地显示在浏览器中,你需要将图片文件放在内置服务器的根目录或其子目录中。以下是详细步骤:1.将图片文件复制到服务器根目录:例如,将zheng.jpeg文件复制到一个特定的目录中(例如,你的项目目录)。假设你将图片文件复制到C:\Users\panda......