Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 无法使用Django中的cursor.execute()写入数据库-未定义此子句的布尔值错误_Python_Django_Python 3.x - Fatal编程技术网

Python 无法使用Django中的cursor.execute()写入数据库-未定义此子句的布尔值错误

Python 无法使用Django中的cursor.execute()写入数据库-未定义此子句的布尔值错误,python,django,python-3.x,Python,Django,Python 3.x,我正在尝试用Django构建一个用户注册表单。我创建了这样一个函数: def create_user(user_dict): from django.db import connection from sqlalchemy.sql import text from django.contrib.auth.hashers import make_password if 'middle_name' not in user_dict: user_dic

我正在尝试用Django构建一个用户注册表单。我创建了这样一个函数:

def create_user(user_dict):
    from django.db import connection
    from sqlalchemy.sql import text
    from django.contrib.auth.hashers import make_password

    if 'middle_name' not in user_dict:
        user_dict['middle_name'] = None
    if 'alt_email' not in user_dict:
        user_dict['alt_email'] = None
    if 'alt_mobile' not in user_dict:
        user_dict['alt_mobile'] = None
    if 'role' not in user_dict:
        user_dict['role'] = None 
    password = make_password(user_dict['password'])
    user_dict['password'] = password

    insert_query = """
    insert into user_info (first_name, middle_name, last_name, email, mobile, alt_email, alt_mobile, password, role )
        values(:first_name, :middle_name, :last_name, :email, :mobile, :alt_email, :alt_mobile, :password, :role)
    """
    insert_query_text = text(insert_query)
    cursor = connection.cursor()
    cursor.execute(insert_query_text, user_dict)
    return(True)
调用此函数时,出现以下错误:

Traceback (most recent call last):
  File "D:\Documents\django\project1\venv\lib\site-packages\django\core\handlers\exception.py", line 34, in inner
    response = get_response(request)
  File "D:\Documents\django\project1\venv\lib\site-packages\django\core\handlers\base.py", line 115, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "D:\Documents\django\project1\venv\lib\site-packages\django\core\handlers\base.py", line 113, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "D:\Documents\django\project1\venv\lib\site-packages\django\views\decorators\csrf.py", line 54, in wrapped_view
    return view_func(*args, **kwargs)
  File "D:\Documents\django\project1\myproject\boards\views.py", line 84, in register_user
    create_user(body)
  File "D:\Documents\django\project1\myproject\boards\methods.py", line 115, in create_user
    cursor.execute(insert_query_text, user_dict)
  File "D:\Documents\django\project1\venv\lib\site-packages\django\db\backends\utils.py", line 100, in execute
    return super().execute(sql, params)
  File "D:\Documents\django\project1\venv\lib\site-packages\django\db\backends\utils.py", line 68, in execute
    return self._execute_with_wrappers(sql, params, many=False, executor=self._execute)
  File "D:\Documents\django\project1\venv\lib\site-packages\django\db\backends\utils.py", line 77, in _execute_with_wrappers
    return executor(sql, params, many, context)
  File "D:\Documents\django\project1\venv\lib\site-packages\django\db\backends\utils.py", line 86, in _execute
    return self.cursor.execute(sql, params)
  File "D:\Documents\django\project1\venv\lib\site-packages\sqlalchemy\sql\elements.py", line 522, in __bool__
    raise TypeError("Boolean value of this clause is not defined")
TypeError: Boolean value of this clause is not defined
当我使用带有SQLAlchemy引擎的Jupyter笔记本运行这个函数时,它也可以正常工作

如果重要的话,我传递的所有值都是字符串


注:这是一个爱好项目,我故意避开Django内置模型,不是因为我不知道它们。

似乎psycopg2不支持
:参数
格式,这可能是导致错误的原因

最后,我不需要单独导入sqlalchemy或psycopg2,我可以使用Django的connection对象执行如下查询:

from django.db import connection

### same code as question ###

insert_query = """
        insert into user_info (first_name, middle_name, last_name, email, mobile,
                                alt_email, alt_mobile, password, role)
            values(%(first_name)s, %(middle_name)s, %(last_name)s, %(email)s, 
                  %(mobile)s, %(alt_email)s, %(alt_mobile)s, %(password)s, %(role)s)
        """

        with connection.cursor() as cursor:
            cursor.execute(insert_query, user_dict)
            connection.commit()
这种方法的优点是,如果没有任何列的值,则可以将None作为值传递,而不是使用普通的%s。这是正确处理的,不会导致错误。跟踪为哪个列传递的值也更容易