| name | django-xugudb-adapter |
| description | Django Python Web 框架适配虚谷数据库(XuguDB)的完整指南。当用户需要将基于 Django 的 Python 项目配置或适配到虚谷数据库时使用此技能,包括驱动安装、数据库配置、模型定义、迁移配置、ORM 操作、管理后台等。适用于从 MySQL/PostgreSQL 迁移或新建虚谷数据库项目。 |
Django 虚谷数据库适配指南
概述
本技能提供 Django 适配虚谷数据库(XuguDB)的完整流程。Django 是 Python 生态中最流行的 Web 框架之一,通过虚谷数据库专用的方言包 xgcondb,可以无缝集成 Django 框架的各种功能,包括 ORM、迁移、管理后台、REST API 等。
适配流程
在开始适配前,按以下顺序检查和修改:
1. 依赖安装 → 2. 数据库配置 → 3. 模型定义 → 4. 数据库迁移 → 5. ORM 操作 → 6. 管理后台 → 7. 测试验证
第一步:安装依赖
安装 Django
pip install django
python -m django --version
安装虚谷数据库驱动
- 获取方言包 - 从虚谷数据库官方下载 Django 方言压缩包(
xugu-django)
- 解压方言包 - 解压压缩包获取所有
.py 文件
- 放置驱动文件 - 将解压目录内的所有
.py 文件复制到虚谷 Python 驱动包内
- 放置驱动包 - 将包含驱动文件的 Python 驱动包放置到 Django 应用启动文件(如
manage.py)的同级目录中
验证驱动安装
import xgcondb
print("xgcondb driver imported successfully")
第二步:创建 Django 项目
创建项目
django-admin startproject myproject
cd myproject
python manage.py startapp myapp
项目结构
myproject/
├── myproject/
│ ├── __init__.py
│ ├── settings.py
│ ├── urls.py
│ ├── wsgi.py
│ └── asgi.py
├── myapp/
│ ├── __init__.py
│ ├── admin.py
│ ├── apps.py
│ ├── models.py
│ ├── views.py
│ ├── tests.py
│ └── migrations/
├── manage.py
└── xgcondb/ # 虚谷数据库驱动目录
第三步:配置数据库
基本数据库配置
在 settings.py 文件中配置数据库连接:
DATABASES = {
'default': {
'ENGINE': 'xgcondb',
'NAME': 'SYSTEM',
'USER': 'SYSDBA',
'PASSWORD': 'SYSDBA',
'HOST': '127.0.0.1',
'PORT': 5138,
}
}
配置参数说明
| 参数 | 说明 | 默认值 |
|---|
| ENGINE | 数据库引擎,必须为 xgcondb | - |
| NAME | 数据库名 | SYSTEM |
| USER | 用户名 | SYSDBA |
| PASSWORD | 密码 | - |
| HOST | 服务器地址(支持多IP,逗号分隔) | 127.0.0.1 |
| PORT | 端口号 | 5138 |
高级数据库配置
DATABASES = {
'default': {
'ENGINE': 'xgcondb',
'NAME': 'mydb',
'USER': 'myuser',
'PASSWORD': 'mypassword',
'HOST': '192.168.1.100',
'PORT': 5138,
'OPTIONS': {
'charset': 'UTF8',
'autocommit': True,
'timeout': 30,
},
'CONN_MAX_AGE': 600,
'CONN_HEALTH_CHECKS': True,
}
}
第四步:定义模型
基本模型定义
from django.db import models
class User(models.Model):
username = models.CharField(max_length=50, unique=True, verbose_name='用户名')
email = models.EmailField(max_length=100, verbose_name='邮箱')
age = models.IntegerField(default=0, verbose_name='年龄')
created_at = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
updated_at = models.DateTimeField(auto_now=True, verbose_name='更新时间')
is_active = models.BooleanField(default=True, verbose_name='是否活跃')
class Meta:
db_table = 'users'
verbose_name = '用户'
verbose_name_plural = '用户'
ordering = ['-created_at']
def __str__(self):
return self.username
关联关系
class Article(models.Model):
title = models.CharField(max_length=200, verbose_name='标题')
content = models.TextField(verbose_name='内容')
author = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name='作者')
created_at = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
class Meta:
db_table = 'articles'
verbose_name = '文章'
verbose_name_plural = '文章'
class Tag(models.Model):
name = models.CharField(max_length=50, unique=True, verbose_name='标签名')
articles = models.ManyToManyField(Article, verbose_name='文章')
class Meta:
db_table = 'tags'
verbose_name = '标签'
verbose_name_plural = '标签'
class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE, verbose_name='用户')
bio = models.TextField(blank=True, verbose_name='简介')
avatar = models.ImageField(upload_to='avatars/', blank=True, verbose_name='头像')
class Meta:
db_table = 'profiles'
verbose_name = '用户资料'
verbose_name_plural = '用户资料'
第五步:数据库迁移
创建迁移文件
python manage.py makemigrations
python manage.py showmigrations
执行迁移
python manage.py migrate
python manage.py migrate myapp
python manage.py migrate myapp 0001
第六步:Django ORM 操作
创建记录
user = User.objects.create(
username='john',
email='john@example.com',
age=25
)
user = User(username='jane', email='jane@example.com', age=30)
user.save()
users = [
User(username='user1', email='user1@example.com', age=20),
User(username='user2', email='user2@example.com', age=25),
User(username='user3', email='user3@example.com', age=30),
]
User.objects.bulk_create(users)
查询记录
users = User.objects.all()
user = User.objects.get(id=1)
user = User.objects.get(username='john')
users = User.objects.filter(age__gt=18)
users = User.objects.filter(age__gte=18, is_active=True)
users = User.objects.filter(username__contains='john')
users = User.objects.filter(email__endswith='@example.com')
users = User.objects.order_by('-created_at')
users = User.objects.order_by('age', '-created_at')
users = User.objects.all()[:10]
users = User.objects.all()[10:20]
count = User.objects.count()
count = User.objects.filter(age__gt=18).count()
from django.db.models import Avg, Sum, Max, Min
avg_age = User.objects.aggregate(Avg('age'))
total_age = User.objects.aggregate(Sum('age'))
更新记录
user = User.objects.get(id=1)
user.age = 26
user.save()
User.objects.filter(is_active=False).update(is_active=True)
User.objects.filter(age__lt=18).update(age=18)
from django.db.models import F
User.objects.update(age=F('age') + 1)
删除记录
user = User.objects.get(id=1)
user.delete()
User.objects.filter(is_active=False).delete()
User.objects.filter(age__lt=18).delete()
User.objects.all().delete()
第七步:Django 管理后台
注册模型
from django.contrib import admin
from .models import User, Article, Tag
@admin.register(User)
class UserAdmin(admin.ModelAdmin):
list_display = ['username', 'email', 'age', 'is_active', 'created_at']
list_filter = ['is_active', 'created_at']
search_fields = ['username', 'email']
list_per_page = 20
@admin.register(Article)
class ArticleAdmin(admin.ModelAdmin):
list_display = ['title', 'author', 'created_at']
list_filter = ['author', 'created_at']
search_fields = ['title', 'content']
@admin.register(Tag)
class TagAdmin(admin.ModelAdmin):
list_display = ['name']
search_fields = ['name']
创建超级用户
python manage.py createsuperuser
访问管理后台
python manage.py runserver
第八步:Django REST framework(可选)
安装 Django REST framework
pip install djangorestframework
配置 Django REST framework
INSTALLED_APPS = [
...
'rest_framework',
]
REST_FRAMEWORK = {
'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
'PAGE_SIZE': 10,
'DEFAULT_AUTHENTICATION_CLASSES': [
'rest_framework.authentication.SessionAuthentication',
'rest_framework.authentication.BasicAuthentication',
],
'DEFAULT_PERMISSION_CLASSES': [
'rest_framework.permissions.IsAuthenticated',
],
}
创建序列化器
from rest_framework import serializers
from .models import User, Article
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ['id', 'username', 'email', 'age', 'created_at', 'updated_at']
read_only_fields = ['created_at', 'updated_at']
class ArticleSerializer(serializers.ModelSerializer):
author = UserSerializer(read_only=True)
class Meta:
model = Article
fields = ['id', 'title', 'content', 'author', 'created_at']
read_only_fields = ['created_at']
第九步:测试验证
运行测试
python manage.py test
python manage.py test myapp
python manage.py test myapp.tests.UserModelTest
验证数据库连接
from django.db import connection
with connection.cursor() as cursor:
cursor.execute("SELECT 1")
result = cursor.fetchone()
print(f"Database connection test: {result}")
常见问题排查
1. 连接错误
现象: 无法连接到虚谷数据库
解决:
- 检查
settings.py 中的连接参数(HOST, PORT, USER, PASSWORD, NAME)是否正确
- 使用其他数据库客户端工具验证连接信息
- 确保虚谷数据库服务已启动
- 检查网络连接和防火墙设置
2. 时区类型错误
现象: AttributeError: 'str' object has no attribute 'utcoffset'
解决: 在 settings.py 文件中将 USE_TZ 设置为 False
USE_TZ = False
3. 方法参数不匹配错误
现象: TypeError: _alter_column_type_sql() takes 5 positional arguments but 7 were given
解决: 下载并使用与您 Django 版本匹配的方言包
4. 迁移失败
现象: 数据库迁移失败
解决:
- 检查模型定义是否正确
- 检查数据库权限
- 检查 SQL 语法兼容性
- 尝试重置迁移:
python manage.py migrate myapp zero
5. 性能问题
现象: 查询响应缓慢
解决:
- 创建合适的索引
- 使用
select_related 和 prefetch_related 优化查询
- 使用分页查询
- 配置数据库连接池
6. 字符编码问题
现象: 数据显示乱码
解决:
- 在数据库配置中添加
charset: 'UTF8'
- 检查数据库字符集配置
- 确保 Django 项目字符编码设置正确
参考文档
详细的配置和使用说明请参考: