2009-02-13 16 views
20

He estado trabajando en una aplicación en Django. Para empezar, por simplicidad, había estado usando sqlite3 para la base de datos.Django + PostgreSQL: ¿Cómo restablecer la clave principal?

Sin embargo, una vez que me mudé a PostgreSQL, me encontré con un pequeño problema: la clave principal no se restablece una vez que borro una tabla.

Esta aplicación es un juego que se juega durante un período de tiempo prolongado (semanas). Como tal, cada vez que se inicia un nuevo juego, todos los datos se borran de la base de datos y luego se agregan nuevos datos aleatorizados.

Me gustaría ser capaces de "empezar de nuevo" con las claves principales comenzando en 1 cada vez que limpio/reconstruyo el juego.

El código sigue funcionando como está, pero los enteros son una forma bastante natural de describir los objetos en mi juego. Me gustaría que cada nuevo juego comience en 1 en lugar de donde sea que el último juego haya quedado.

¿Cómo puedo restablecer el contador de claves principales en PostgreSQL? Tenga en cuenta que no es necesario que conserve los datos en la tabla, ya que lo estoy eliminando de todos modos.

+0

supongo que podría recurrir a simplemente dejar caer la tabla y luego volver a crearlo, pero yo preferiría no hacerlo si se pudiera evitar ... –

+0

dejé caer la mesa yo mismo ... me estaba llevando demasiado tiempo tratando de descubrir – fuentesjr

Respuesta

25

En su directorio de aplicación intente esto:

python manage.py help sqlsequencereset 

Pipe en psql como esto para ejecutar realmente el reinicio:

python manage.py sqlsequencereset myapp1 myapp2 | psql 

Editar: he aquí un ejemplo de la salida de este comando en una de mis tablas:

BEGIN; 
SELECT setval('"project_row_id_seq"', coalesce(max("id"), 1), max("id") IS NOT null) FROM "project_row"; 
COMMIT; 
+0

¿y si es una instalación de Windows? – fuentesjr

+0

El comando sqlsequencereset genera el SQL necesario para restablecer el contador de clave principal, por lo que en Windows, en lugar de conectar el resultado a psql, copiaría y pegaría en cualquier aplicación de administrador que utilice. Por ejemplo, si está instalado pgAdminIII, pegue en "ejecutar consultas SQL arbitrarias". –

+0

Comprobaré esto cuando llegue a casa del trabajo, ¡gracias! ¿Hay forma de hacer esto programáticamente? Me gustaría poder pegarlo fácilmente en una vista django si es posible. –

0
+0

Parece que no funciona ... borra todos los datos, pero las claves principales aún comienzan donde lo dejé antes. Por ejemplo, si inserto 500 filas, trunque la tabla, luego inserte otras 500, las claves principales serán de 501 a 1000, no de 1-500. –

+0

Hmmm, intente esto: ALTER TABLE theTableInQuestion AUTO_INCREMENT = 0 – superUntitled

+0

No importa, eso es para mySql, lo siento, no puedo ayudarle. – superUntitled

1

I view Aumenta automáticamente las claves primarias como identificadores puramente internos para los registros de la base de datos, y no me gusta exponerlas a los usuarios. Por supuesto, es un diseño común usarlos como parte de las URL, pero incluso allí las babosas u otros identificadores se sienten más apropiados.

+0

Normalmente también lo haría, pero los objetos en este caso ya van a estar numerados, y se mostrarán como 1, 2, 3 ... etc. –

Cuestiones relacionadas