【Django问题解决】‘python manager.py inspectdb'命令问题解决

本文记录了解决Django项目中使用cx_Oracle数据库连接时遇到的版本兼容性问题。通过版本试错,发现Django的2.1和1.1版本与cx_Oracle的多个版本组合均报错。最终选择Django 1.11.18成功解决了问题,强调了解决此类问题时需要耐心分析和理解错误信息的重要性。
部署运行你感兴趣的模型镜像

报错信息

AttributeError: 'cx_Oracle.Cursor' object has no attribute 'numbersAsStrings'

然后安装低版本的cxOracle==5.2,6.*的时候又包clang的问题。

根据以往的经验直觉,出现这样的问题绝对不是包的问题,也不是主机环境的问题。

可以确定的是Python + Django + cxOracle 这三者之间出现版本匹配的问题。

版本试错

使用pyenv装了python 2.7.14, Python 3.7.1.

Python2的情况下:

  • Django 2.1 + cxOracle 5、6、7 报错
  • Django 1.1 + cxOracle 5、6、7 报错

Python3的情况下:

  • Django 2.1 + cxOracle 5、6、7 报错
  • Django 1.1 + cxOracle 5、6、7 报错

这就奇怪了!!!

由于版本的版本问题,本人更倾向于使用Python3,毕竟大势所趋,所以最后还是使用Python3的解释器。

吃了晚饭回来,继续尝试。

问题分析

  • Django 2.1 + cxOracle 5、6、7 报错
  • Django 1.1 + cxOracle 5、6、7 报错
    都报错,说明不是Python版本的问题, 可以继续使用Python3。

由于查过官网,知道Django2.1是不支持 Oracle12g的(自己的是11g),所以不能再安装Django 2.*了。

于是使用命令: pip install django== 看看Django 1.11的小版本号有哪些。

Collecting django==
  Could not find a version that satisfies the requirement django== (from versions:
   1.1.3, 1.1.4, 1.2, 1.2.1, 1.2.2, 1.2.3, 1.2.4, 1.2.5, 1.2.6, 1.2.7, 1.3, 1.3.1, 1.3.2, 1.3.3, 1.3.4, 1.3.5, 1.3.6, 1.3.7, 1.4, 1.4.1, 1.4.2, 1.4.3, 1.4.4, 1.4.5, 1.4.6, 1.4.7, 1.4.8, 1.4.9, 1.4.10, 1.4.11, 1.4.12, 1.4.13, 1.4.14, 1.4.15, 1.4.16, 1.4.17, 1.4.18, 1.4.19, 1.4.20, 1.4.21, 1.4.22, 1.5, 1.5.1, 1.5.2, 1.5.3, 1.5.4, 1.5.5, 1.5.6, 1.5.7, 1.5.8, 1.5.9, 1.5.10, 1.5.11, 1.5.12, 1.6, 1.6.1, 1.6.2, 1.6.3, 1.6.4, 1.6.5, 1.6.6, 1.6.7, 1.6.8, 1.6.9, 1.6.10, 1.6.11, 1.7, 1.7.1, 1.7.2, 1.7.3, 1.7.4, 1.7.5, 1.7.6, 1.7.7, 1.7.8, 1.7.9, 1.7.10, 1.7.11, 1.8a1, 1.8b1, 1.8b2, 1.8rc1, 1.8, 1.8.1, 1.8.2, 1.8.3, 1.8.4, 1.8.5, 1.8.6, 1.8.7, 1.8.8, 1.8.9, 1.8.10, 1.8.11, 1.8.12, 1.8.13, 1.8.14, 1.8.15, 1.8.16, 1.8.17, 1.8.18, 1.8.19, 1.9a1, 1.9b1, 1.9rc1, 1.9rc2, 1.9, 1.9.1, 1.9.2, 1.9.3, 1.9.4, 1.9.5, 1.9.6, 1.9.7, 1.9.8, 1.9.9, 1.9.10, 1.9.11, 1.9.12, 1.9.13, 1.10a1, 1.10b1, 1.10rc1, 1.10, 1.10.1, 1.10.2, 1.10.3, 1.10.4, 1.10.5, 1.10.6, 1.10.7, 1.10.8, 1.11a1, 1.11b1, 1.11rc1, 1.11, 1.11.1, 1.11.2, 1.11.3, 1.11.4, 1.11.5, 1.11.6, 1.11.7, 1.11.8, 1.11.9, 1.11.10, 1.11.11, 1.11.12, 1.11.13, 1.11.14, 1.11.15, 1.11.16, 1.11.17, 1.11.18, 1.11.20, 2.0a1, 2.0b1, 2.0rc1, 2.0, 2.0.1, 2.0.2, 2.0.3, 2.0.4, 2.0.5, 2.0.6, 2.0.7, 2.0.8, 2.0.9, 2.0.10, 2.0.12, 2.0.13, 2.1a1, 2.1b1, 2.1rc1, 2.1, 2.1.1, 2.1.2, 2.1.3, 2.1.4, 2.1.5, 2.1.7, 2.2a1, 2.2b1)

根据经验,不能太新,不能过旧,由于Django 1.11 是LTS版本,所以想了下,选择了 Django 1.11.18。
执行命令: pip install django==1.11.18 ,然后 python manager.py inspectdb.

出现一下:

# This is an auto-generated Django model module.
# You'll have to do the following manually to clean this up:
#   * Rearrange models' order
#   * Make sure each model has one field with primary_key=True
#   * Make sure each ForeignKey has `on_delete` set to the desired behavior.
#   * Remove `managed = False` lines if you wish to allow Django to create, modify, and delete the table
# Feel free to rename the models, but don't rename db_table values or field names.
from __future__ import unicode_literals

from django.db import models

OK,成了。

总结

由于以前开发使用的是Python2,2019开始使用Python3,第一次开始尝试到了工具版本切换带来的挑战。
不难想象,以后类似的问题还是会有的。

关键还是要耐心看报错,细心看报错,遇到问题不要第一时间copy报错就查,先自己分析问题所在,然后再去网上查;如果什么苗头都不知道,就copy报错一通查,运气好可以碰到解决方案,运气不好,查的越多,人反而越急躁。

因此,沉着耐心分析问题是第一。

您可能感兴趣的与本文相关的镜像

Python3.10

Python3.10

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

<think>我们遇到的问题是在交互式控制台(如Python shell)中直接输入了命令 `python manage.py runserver` 并出现了 `IndentationError: unexpected indent` 错误。 错误原因:在Python交互式环境中(如使用`python`命令启动的shell或Django的`shell`命令),我们只能执行Python语句,而不能直接执行系统命令(如`python manage.py runserver`)。而且错误信息指出“意外的缩进”,这是因为在交互式环境中,命令提示符`>>>`后面应该输入Python代码,而这里输入的命令行被当作Python代码解析,而该行前面有格(缩进),导致了错误。 正确的方法:在操作系统的命令行终端(如Windows的cmd、PowerShell,或Unix/Linux的终端)中运行Django管理命令,而不是在Python交互式环境中。 解决方案: 1. 退出当前的Python交互式环境(如果正在使用的话)。 2. 在操作系统的命令行中运行Django命令。 步骤: 以Windows系统为例(假设当前目录是项目根目录`D:\python\county_edu`): - 退出Python交互环境:在`>>>`提示符后输入`exit()`并按回车,或者按`Ctrl+Z`再按回车(Windows)或`Ctrl+D`(Unix/Linux)退出。 - 然后直接在命令行(如PowerShell)中输入: python manage.py runserver 详细步骤: 错误示例: 用户在Python交互式环境中输入: >>> python manage.py runserver (注意前面可能有格,或者即使没有格也会出错) 正确做法: - 打开操作系统的命令行(如Windows的cmd或PowerShell,Mac/Linux的终端) - 切换到项目目录(例如:`cd D:\python\county_edu`) - 然后运行:`python manage.py runserver` 代码演示(在操作系统的命令行中,而不是Python交互环境): ```bash # 切换目录到项目根目录 cd D:\python\county_edu # 运行Django开发服务器 python manage.py runserver ``` 解释: - `cd` 命令用于更改当前工作目录。 - `python manage.py runserver` 是启动Django开发服务器的命令。 另外,如果需要在交互式环境中模拟运行命令,可以使用`os.system`或`subprocess`模块,但不推荐用于运行Django服务器,因为这样会阻塞交互式环境。 例如,如果非要在交互式环境中运行,可以这样做(但强烈建议不要这样运行服务器,因为这样会导致交互式环境无法使用): ```python >>> import os >>> os.system('python manage.py runserver') ``` 或者 ```python >>> import subprocess >>> subprocess.call(['python', 'manage.py', 'runserver']) ``` 但是,最好的方法还是直接在操作系统的终端中运行。 关于Django开发服务器的补充: - 默认情况下,服务器将运行在127.0.0.1:8000。 - 如果需要指定IP和端口,可以这样: python manage.py runserver 0.0.0.0:8000 # 允许外部访问 最后,为了避免混淆,请注意区分操作系统的命令行和Python的交互式环境。 总结:在操作系统的命令行中运行Django管理命令,而不是在Python交互式环境中。 §§相关问题§§: 1. 如何在Django中创建自定义管理命令? 2. Django开发服务器的内部工作原理是什么? 3. 如何在后台运行Django开发服务器? 4. 如何配置Django以使用不同的环境设置(如开发、测试、生产)? </think># 解决 Django 中的 `IndentationError: unexpected indent` 错误 您在 Django 的交互式 shell 中遇到了意外的缩进错误。这个错误发生在您尝试在 Python shell 中运行命令命令而不是在系统终端中运行它时。我将详细解释这个问题并提供完整的解决方案。 ## 问题原因分析 错误信息: ``` >>> python manage.py runserver File "<console>", line 1 python manage.py runserver IndentationError: unexpected indent ``` 这个错误的原因是: 1. 您正在 Python 交互式 shell(通过 `python manage.py shell` 启动)中操作 2. 在 shell 中,您尝试输入了系统命令 `python manage.py runserver` 3. Python 解释器将这些内容当作 Python 代码来解析 4. 命令前面的格被解释为缩进,导致语法错误 ## 完整解决方案 ### 1. 正确启动 Django 开发服务器的方法 Django 开发服务器应该从系统命令行终端启动,而不是在 Python shell 中启动: ```bash # 在操作系统终端中执行(不是 Python shell) # Windows(PowerShell 或 CMD) python manage.py runserver # macOS/Linux python3 manage.py runserver ``` ### 2.Python shell 中的正确操作方式 如果您已经进入了 Django shell(通过 `python manage.py shell`),以下是正确的操作方式: #### 查看当前模型数据 ```python from school_manager.models import School, Teacher # 查询所有学校 schools = School.objects.all() for school in schools: print(f"{school.name}: {school.student_count} 学生, {school.teacher_count} 教师") # 查询特定学校的教师 demo_school = School.objects.get(name="示范学校") teachers = Teacher.objects.filter(school=demo_school) for teacher in teachers: print(f"{teacher.name} - {teacher.subject} - {teacher.monthly_salary}元/月") ``` #### 创建新对象 ```python from school_manager.models import School, Teacher from django.utils import timezone # 创建新学校 new_school = School( name="新示范学校", county="A县", address="新示范路456号", established_date=timezone.now().date() ) new_school.save() # 创建新教师 new_teacher = Teacher( name="李老师", school=new_school, year_started=2020, subject="语文", monthly_salary=8500.00 ) new_teacher.save() ``` ### 3. 使用 Django Extensions 增强 shell 体验 安装 Django Extensions: ```bash pip install django-extensions ``` 添加到 `INSTALLED_APPS`: ```python # settings.py INSTALLED_APPS = [ # ... 'django_extensions', ] ``` 使用增强 shell: ```bash python manage.py shell_plus --ipython ``` ### 4. 常见错误场景及解决方法 | 错误场景 | 错误原因 | 解决方法 | |----------|----------|----------| | 在 Python shell 中运行 `python manage.py ...` | 混淆了系统命令Python 代码 | 在系统终端中运行命令 | | 在系统终端中使用 Django ORM 查询 | 试图在非 Python 环境中执行 Python 代码 | 进入 Python shell (`python manage.py shell`) | | 在 IDE 中混淆运行环境 | IDE 中的 Python 控制台和终端控制台混淆 | 明确区分 IDE 中的不同工具窗口 | | 在 Jupyter Notebook 中运行系统命令 | 混淆了 Notebook cell 和系统命令 | 在 Notebook 中使用 `!` 前缀执行系统命令 | ### 5. 开发工作流最佳实践 #### 推荐工作流: 1. 打开两个终端窗口: - **终端1**:运行开发服务器 ```bash python manage.py runserver ``` - **终端2**:用于执行管理命令和进入 shell ```bash # 执行迁移 python manage.py makemigrations python manage.py migrate # 进入交互式 shell python manage.py shell ``` #### IDE 配置(以 VS Code 为例): 1. 创建两个终端会话: - 一个是 Python 环境(用于运行服务器) - 另一个是系统命令行(用于管理命令) 2. 创建 `launch.json` 配置 Django 调试: ```json { "version": "0.2.0", "configurations": [ { "name": "Django", "type": "python", "request": "launch", "program": "${workspaceFolder}/manage.py", "args": ["runserver"], "django": true, "autoReload": { "enable": true } } ] } ``` ### 6. 高级使用技巧 #### 使用 Django shell 进行数据库维护: ```python from school_manager.models import School, Teacher # 批量更新教师工资 Teacher.objects.filter(subject='数学').update(monthly_salary=models.F('monthly_salary') * 1.1) # 删除无效数据 School.objects.filter(student_count=0, teacher_count=0).delete() # 导出学校数据到 CSV import csv with open('schools.csv', 'w', newline='', encoding='utf-8') as csvfile: writer = csv.writer(csvfile) writer.writerow(['学校名称', '所在县', '学生人数', '教师人数']) for school in School.objects.all(): writer.writerow([ school.name, school.county, school.student_count, school.teacher_count ]) ``` #### 创建自定义 shell 命令: ```python # school_manager/management/commands/custom_shell.py from django.core.management.base import BaseCommand from django.db import connection class Command(BaseCommand): help = '自定义增强的 Django shell' def handle(self, *args, **kwargs): # 预加载常用模型 from school_manager.models import School, Teacher, Student from django.db.models import Count, Sum # 提供高级功能 print("\n自定义 Django shell 已启动!") print("已预加载模型: School, Teacher, Student") # 启动 IPython(如果可用) try: from IPython import embed embed() except ImportError: import code code.interact(local=locals()) ``` 使用自定义 shell: ```bash python manage.py custom_shell ``` ### 7. 调试技巧 #### 在 shell 中调试模型方法: ```python from school_manager.models import Teacher # 获取一个教师实例 teacher = Teacher.objects.first() # 调试方法 import pdb; pdb.set_trace() # 在这里可以检查对象状态 # 调用方法 service_years = teacher.years_of_service() print(f"服务年限: {service_years}") ``` #### 使用 Django Debug Toolbar: 1. 安装: ```bash pip install django-debug-toolbar ``` 2. 配置 `settings.py`: ```python INSTALLED_APPS = [ # ... 'debug_toolbar', ] MIDDLEWARE = [ # ... 'debug_toolbar.middleware.DebugToolbarMiddleware', ] INTERNAL_IPS = ['127.0.0.1'] ``` 3. 配置 `urls.py`: ```python if settings.DEBUG: import debug_toolbar urlpatterns = [ path('__debug__/', include(debug_toolbar.urls)), ] + urlpatterns ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值