在Django中通过settings.py或models.py自动创建数据库
当前的流程:
1) mysql >> CREATE {DATABASE} db_name [create_specification] ;
2) change database info in settings.py
3) python manage.py syncdb (assuming we have ready-made models)
有没有办法不使用第一步就能做到同样的事情?也许可以把数据库名称和设置放在settings.py文件里,这样我每次把这个项目转移到服务器时就不需要手动配置数据库了。
编辑 - 我为什么想跳过第一步:
在我的情况下,不同表的不同列有不同的排序规则。所以在开发过程中,每次我重新创建数据库时,都需要手动更改每个列和表的配置,这让我觉得很烦。
5 个回答
在开发阶段,你可以使用sqlite。
在部署时给整个应用程序的数据库创建权限,这听起来像是个坏主意,因为这样可能会导致一些小问题。
你应该创建一个单独的脚本,来自动化部署的过程。Fabric 似乎已经成为了这个领域的标准工具。
通过 django_extensions 实现:
1) ./manage.py sqlcreate | ./manage.py dbshell
2) ./manage.py migrate
如果在 settings.py 中的用户已经能够连接到数据库并且有创建权限,这个方法应该能正常工作。
为了实现这一点,我建议你设置一个环境变量 DATABASE_URL,并使用 dj_database_url。
至少在我使用 Postgres 的时候是有效的。
我觉得如果你在Django中使用除了SQLite以外的其他数据库,第一步是无法跳过的。
文档中的说明:https://docs.djangoproject.com/en/dev/intro/tutorial01/#database-setup
如果你使用的是PostgreSQL或MySQL,确保到这个时候你已经创建了一个数据库。你可以在数据库的交互提示符中输入“CREATE DATABASE 数据库名称;”来创建。
如果你使用的是SQLite,就不需要提前创建任何东西——当需要时,数据库文件会自动创建。
如果你把项目迁移到像Heroku这样的服务器上,数据库的创建会自动完成,就像使用PostgreSQL一样。
我在想你为什么想跳过第一步,不过如果你真的很着急,或许可以尝试通过psycopg2直接用Python的方式来创建数据库。
你只需要知道数据库的用户名和密码,并且这个用户要有创建数据库的权限,其他的设置都在配置文件里。你可以把一个自定义命令连接到 pre_syncdb 信号,这样就能收集到这些数据。
可以看看 createsuperuser 这个文件,它是在 post_syncdb 信号触发时被调用的,了解一下这个过程。
编辑
syncdb 这个功能已经不再使用。从 1.9 版本开始,你应该使用 pre_migrate 信号。