我被这个django原始sql请求搞糊涂了
设置.py

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2', # Add 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'.
        'NAME': 'myapp',                      # Or path to database file if using sqlite3.
        'USER': 'postgres',                      # Not used with sqlite3.
        'PASSWORD': 'password',                  # Not used with sqlite3.
        'HOST': 'localhost',                      # Set to empty string for localhost. Not used with sqlite3.
        'PORT': '5432',                      # Set to empty string for default. Not used with sqlite3.
        #'OPTIONS': { 'init_command': 'SET storage_engine=INNODB;' }
    },
    'mysql': {
        'ENGINE': 'django.db.backends.mysql', # Add 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'.
        'NAME': 'myapp',                      # Or path to database file if using sqlite3.
        'USER': 'root',                      # Not used with sqlite3.
        'PASSWORD': 'password',                  # Not used with sqlite3.
        'HOST': '',                      # Set to empty string for localhost. Not used with sqlite3.
        'PORT': '',                      # Set to empty string for default. Not used with sqlite3.
        #'OPTIONS': { 'init_command': 'SET storage_engine=INNODB;' }
    }
}

sql请求
from django.db import connections
cursor = connections['mysql'].cursor()
cursor2 = connections['default'].cursor()
cursor.execute("select user_id,group_id from auth_user_groups")
cursor2.execute("select id,username from auth_user")

for r in cursor2.fetchall():
    self.stdout.write(r[0])

cursor2.execute("insert into auth_user_groups(user_id,group_id) values (1,1);")

它返回一个错误(auth_user表中确实有数百个用户)
AttributeError: 'int' object has no attribute 'endswith'

排队
for r in cursor2.fetchall():
    self.stdout.write(r[0])

我希望这条线
cursor2.execute("insert into auth_user_groups(user_id,group_id) values (1,1);")

插入一行以验证用户组表位。
这是怎么回事?
谢谢
更新
现在问题已经解决了。我错过了一个
connections['default'].commit()

用于插入

最佳答案

对于查询,r[0]是一个intlong字段,而stdout.write需要一个字符串。
而且update语句可能没有执行,因为在到达该语句之前您会收到一个异常,所以脚本执行结束。
我不明白为什么要对这些查询执行原始SQL语句,也不明白为什么要使用write而不是print,但我想这不是你问的问题。

07-28 06:54