这就是我想要做的事情:
我有一个从另一个数据库导入的表。其中一个表的大多数列看起来像这样:AP1 | 00:23:69:33:C1:4F并且它们中有很多。我不认为python会接受它们作为字段名称。
我想要汇总它们,而不必将它们列为模型中的字段。我希望尽可能从Django应用程序中触发聚合,所以我不想在应用程序之外创建MySQL查询。
感谢。
答案 0 :(得分:2)
除非你想编写原始sql,否则你将不得不定义一个模型。由于您的模型字段的名称不必与它们所代表的列相同,因此您可以为字段指定有用的名称。
class LegacyTable(models.Model):
useful_name = models.IntegerField(db_column="AP1|00:23:69:33:C1:4F")
class Meta:
db_table = "LegacyDbTableThatHurtsMyHead"
managed = False # syncdb does nothing
你也可以这样做。只要您需要在旧数据库表中使用其他列,只需将another_useful_name
添加到您的模型中,并将db_column
设置为您感兴趣的列。
这有两个可靠的好处。一,你不再需要编写原始sql。第二,你不必预先定义所有的字段。
另一种方法是在raw sql中定义所有字段。
编辑:
Legacy Databases描述了一种检查现有数据库并从现有模式生成models.py文件的方法。这个可以帮助你完成所有繁重的工作(空值,长度,类型,字段)。然后,您可以修改定义以满足您的需求。
python manage.py inspectdb > legacy.py
答案 1 :(得分:0)
http://docs.djangoproject.com/en/dev/topics/db/sql/#executing-custom-sql-directly
Django允许您执行原始SQL查询。如果没有关于您的表格的更多信息,那就是我能提供的所有信息。
自定义查询:
def my_custom_sql():
from django.db import connection, transaction
cursor = connection.cursor()
# Data modifying operation - commit required
cursor.execute("UPDATE bar SET foo = 1 WHERE baz = %s", [self.baz])
transaction.commit_unless_managed()
# Data retrieval operation - no commit required
cursor.execute("SELECT foo FROM bar WHERE baz = %s", [self.baz])
row = cursor.fetchone()
return row
访问其他数据库:
from django.db import connections
cursor = connections['my_db_alias'].cursor()
# Your code here...
transaction.commit_unless_managed(using='my_db_alias')