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 комментариев