Django. Создание таблиц в базе данных при помощи моделей
В данной статье я расскажу про свой опыт работы с Django. Необходимо было динамически создавать таблицы в базе данных из семи типов моделей. Понятно, что можно самому написать запрос, но в проекте использовалось две различные базы данных, и поэтому хотелось это сделать красиво, без написания запросов.
Понятное дело, что syncdb в django это делать умеет. Никакой документации на тот момент по этому поводу не было, поэтому пришлось лезть в исходники Django и узнать, как же все таки он это делает. С этим и спешу поделиться.
Для того, чтобы воспользоваться этими функциями, достаточно передать какую-нибудь модель.
Но до этого конечно нужно сменить название создаваемой таблицы, а делается это так
Теперь можно думаю без проблем написать что-то вроде своего syncdb. Спасибо за внимание.
Понятное дело, что syncdb в django это делать умеет. Никакой документации на тот момент по этому поводу не было, поэтому пришлось лезть в исходники Django и узнать, как же все таки он это делает. С этим и спешу поделиться.
<code class="python"> def drop_table(cls, database = 'data'): cursor = connections[database].cursor() drop_sql = connections[database].creation.sql_destroy_model(cls, (), no_style()) for s in drop_sql: try: cursor.execute(s) except Exception as e: print e.message def create_table(cls, database = 'data'): cursor = connections[database].cursor() sql, references = connections[database].creation.sql_create_model(cls, no_style()) for q in sql: try: # print q cursor.execute(q) except Exception as e: print e.message </code>
Для того, чтобы воспользоваться этими функциями, достаточно передать какую-нибудь модель.
<code class="python">class testModel(models.Model): id = models.AutoField(primary_key=True) count = models.IntegerField(null=True) class Meta: db_table = 'no_name' </code>
Но до этого конечно нужно сменить название создаваемой таблицы, а делается это так
<code class="python">testModel._meta.db_table = 'testTable1' create_table(testModel) </code>
Теперь можно думаю без проблем написать что-то вроде своего syncdb. Спасибо за внимание.
0 комментариев