<commit_before>.. _faq-models:

FAQ: Databases and models
=========================

How can I see the raw SQL queries Django is running?
----------------------------------------------------

Make sure your Django ``DEBUG`` setting is set to ``True``. Then, just do
this::

    >>> from django.db import connection
    >>> connection.queries
    [{'sql': 'SELECT polls_polls.id,polls_polls.question,polls_polls.pub_date FROM polls_polls',
    'time': '0.002'}]

``connection.queries`` is only available if ``DEBUG`` is ``True``. It's a list
of dictionaries in order of query execution. Each dictionary has the following::

    ``sql`` -- The raw SQL statement
    ``time`` -- How long the statement took to execute, in seconds.

``connection.queries`` includes all SQL statements -- INSERTs, UPDATES,
SELECTs, etc. Each time your app hits the database, the query will be recorded.

Can I use Django with a pre-existing database?
----------------------------------------------

Yes. See :ref:`Integrating with a legacy database <howto-legacy-databases>`.

If I make changes to a model, how do I update the database?
-----------------------------------------------------------

If you don't mind clearing data, your project's ``manage.py`` utility has an
option to reset the SQL for a particular application::

    manage.py reset appname

This drops any tables associated with ``appname`` and recreates them.

If you do care about deleting data, you'll have to execute the ``ALTER TABLE``
statements manually in your database. That's the way we've always done it,
because dealing with data is a very sensitive operation that we've wanted to
avoid automating. That said, there's some work being done to add partially
automated database-upgrade functionality.

Do Django models support multiple-column primary keys?
------------------------------------------------------

No. Only single-column primary keys are supported.

But this isn't an issue in practice, because there's nothing stopping you from
adding other constraints (using the ``unique_together`` model option or
creating the constraint directly in your database), and enforcing the
uniqueness at that level. Single-column primary keys are needed for things such
as the admin interface to work; e.g., you need a simple way of being able to
specify an object to edit or delete.

How do I add database-specific options to my CREATE TABLE statements, such as specifying MyISAM as the table type?
------------------------------------------------------------------------------------------------------------------

We try to avoid adding special cases in the Django code to accommodate all the
database-specific options such as table type, etc. If you'd like to use any of
these options, create an :ref:`SQL initial data file <initial-sql>` that
contains ``ALTER TABLE`` statements that do what you want to do. The initial
data files are executed in your database after the ``CREATE TABLE`` statements.

For example, if you're using MySQL and want your tables to use the MyISAM table
type, create an initial data file and put something like this in it::

    ALTER TABLE myapp_mytable ENGINE=MyISAM;

As explained in the :ref:`SQL initial data file <initial-sql>` documentation,
this SQL file can contain arbitrary SQL, so you can make any sorts of changes
you need to make.

Why is Django leaking memory?
-----------------------------

Django isn't known to leak memory. If you find your Django processes are
allocating more and more memory, with no sign of releasing it, check to make
sure your ``DEBUG`` setting is set to ``True``. If ``DEBUG`` is ``True``, then
Django saves a copy of every SQL statement it has executed.

(The queries are saved in ``django.db.connection.queries``. See
`How can I see the raw SQL queries Django is running?`_.)

To fix the problem, set ``DEBUG`` to ``False``.

If you need to clear the query list manually at any point in your functions,
just call ``reset_queries()``, like this::

    from django import db
    db.reset_queries()<commit_msg>Fixed #9468 -- Fixed a misleading FAQ answer.<commit_after>.. _faq-models:

FAQ: Databases and models
=========================

How can I see the raw SQL queries Django is running?
----------------------------------------------------

Make sure your Django ``DEBUG`` setting is set to ``True``. Then, just do
this::

    >>> from django.db import connection
    >>> connection.queries
    [{'sql': 'SELECT polls_polls.id,polls_polls.question,polls_polls.pub_date FROM polls_polls',
    'time': '0.002'}]

``connection.queries`` is only available if ``DEBUG`` is ``True``. It's a list
of dictionaries in order of query execution. Each dictionary has the following::

    ``sql`` -- The raw SQL statement
    ``time`` -- How long the statement took to execute, in seconds.

``connection.queries`` includes all SQL statements -- INSERTs, UPDATES,
SELECTs, etc. Each time your app hits the database, the query will be recorded.

Can I use Django with a pre-existing database?
----------------------------------------------

Yes. See :ref:`Integrating with a legacy database <howto-legacy-databases>`.

If I make changes to a model, how do I update the database?
-----------------------------------------------------------

If you don't mind clearing data, your project's ``manage.py`` utility has an
option to reset the SQL for a particular application::

    manage.py reset appname

This drops any tables associated with ``appname`` and recreates them.

If you do care about deleting data, you'll have to execute the ``ALTER TABLE``
statements manually in your database. That's the way we've always done it,
because dealing with data is a very sensitive operation that we've wanted to
avoid automating. That said, there's some work being done to add partially
automated database-upgrade functionality.

Do Django models support multiple-column primary keys?
------------------------------------------------------

No. Only single-column primary keys are supported.

But this isn't an issue in practice, because there's nothing stopping you from
adding other constraints (using the ``unique_together`` model option or
creating the constraint directly in your database), and enforcing the
uniqueness at that level. Single-column primary keys are needed for things such
as the admin interface to work; e.g., you need a simple way of being able to
specify an object to edit or delete.

How do I add database-specific options to my CREATE TABLE statements, such as specifying MyISAM as the table type?
------------------------------------------------------------------------------------------------------------------

We try to avoid adding special cases in the Django code to accommodate all the
database-specific options such as table type, etc. If you'd like to use any of
these options, create an :ref:`SQL initial data file <initial-sql>` that
contains ``ALTER TABLE`` statements that do what you want to do. The initial
data files are executed in your database after the ``CREATE TABLE`` statements.

For example, if you're using MySQL and want your tables to use the MyISAM table
type, create an initial data file and put something like this in it::

    ALTER TABLE myapp_mytable ENGINE=MyISAM;

As explained in the :ref:`SQL initial data file <initial-sql>` documentation,
this SQL file can contain arbitrary SQL, so you can make any sorts of changes
you need to make.

Why is Django leaking memory?
-----------------------------

Django isn't known to leak memory. If you find your Django processes are
allocating more and more memory, with no sign of releasing it, check to make
sure your ``DEBUG`` setting is set to ``False``. If ``DEBUG`` is ``True``, then
Django saves a copy of every SQL statement it has executed.

(The queries are saved in ``django.db.connection.queries``. See
`How can I see the raw SQL queries Django is running?`_.)

To fix the problem, set ``DEBUG`` to ``False``.

If you need to clear the query list manually at any point in your functions,
just call ``reset_queries()``, like this::

    from django import db
    db.reset_queries()
{'fraction_non_alphanumeric': 0.1597728114582047, 'fraction_numerical': 0.0014816644030127175, 'mean_word_length': 2.8516405135520686, 'pattern_counts': {'":': 0, '<': 9, '<?xml version=': 0, '>': 21, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '5282239', 'n_tokens_mistral': 2031, 'n_tokens_neox': 1923, 'n_words': 1107}