当前位置: 首页 > 知识库问答 >
问题:

Heroku PostgreSQL SQLAlchemy语法错误

公良理
2023-03-14

Exception on /viewreports [POST]
2021-06-19T01:55:40.057253+00:00 app[web.1]: Traceback (most recent call last):
packages/sqlalchemy/engine/base.py", line 1276, in _execute_context
-packages/sqlalchemy/engine/default.py", line 608, in do_execute
2021-06-19T01:55:40.057256+00:00 app[web.1]:     cursor.execute(statement, parameters)
2021-06-19T01:55:40.057257+00:00 app[web.1]: psycopg2.errors.SyntaxError: syntax error at or near ")"
2021-06-19T01:55:40.057258+00:00 app[web.1]: LINE 1: ... ON usersport.sport_id=sport.sport_id WHERE sport_name=(?)  

2021-06-19T01:55:40.057259+00:00 app[web.1]: The above exception was the direct cause of the following exception:
2021-06-19T01:55:40.057259+00:00 app[web.1]: 
2021-06-19T01:55:40.057260+00:00 app[web.1]: Traceback (most recent call last):
2021-06-19T01:55:40.057275+00:00 app[web.1]:   File "/app/.heroku/python/lib/python3.9/site-packages/flask/app.py", line 2447, in wsgi_app
2021-06-19T01:55:40.057275+00:00 app[web.1]:     response = self.full_dispatch_request()

2021-06-19T01:55:40.057279+00:00 app[web.1]:   File "/app/schoolsports/routes.py", line 269, in viewreports
2021-06-19T01:55:40.057285+00:00 app[web.1]:     result1=db.engine.execute("SELECT user_id FROM usersport INNER JOIN sport ON usersport.sport_id=sport.sport_id WHERE sport_name=(?)  ",(value))

2021-06-19T01:55:40.057289+00:00 app[web.1]:     self.dialect.do_execute(
2021-06-19T01:55:40.057289+00:00 app[web.1]:   File "/app/.heroku/python/lib/python3.9/site-packages/sqlalchemy/engine/default.py", line 608, in do_execute
2021-06-19T01:55:40.057290+00:00 app[web.1]:     cursor.execute(statement, parameters)
2021-06-19T01:55:40.057290+00:00 app[web.1]: sqlalchemy.exc.ProgrammingError: (psycopg2.errors.SyntaxError) syntax error at or near ")"
2021-06-19T01:55:40.057290+00:00 app[web.1]: LINE 1: ... ON usersport.sport_id=sport.sport_id WHERE sport_name=(?)  
2021-06-19T01:55:40.057290+00:00 app[web.1]:                                                                     ^
2021-06-19T01:55:40.057291+00:00 app[web.1]: 
2021-06-19T01:55:40.057291+00:00 app[web.1]: [SQL: SELECT user_id FROM usersport INNER JOIN sport ON usersport.sport_id=sport.sport_id WHERE sport_name=(?)  ]
2021-06-19T01:55:40.057291+00:00 app[web.1]: [parameters: ('taekwondo',)]
2021-06-19T01:55:40.057291+00:00 app[web.1]: (Background on this error at: http://sqlalche.me/e/13/f405)
2021-06-19T01:55:40.058121+00:00 app[web.1]: 10.45.135.21 - - [19/Jun/2021:01:55:40 +0000] "POST /viewreports HTTP/1.1" 500 290 "https://mymodule.herokuapp.com/viewreports" 


我已经将我的flask web应用程序部署到Heroku,Heroku最初使用的是SQLite本地数据库,我的所有命令都可以正常工作。现在,当我部署到Heroku并使用PostgreSQL数据库时,我会遇到一些语法和编程错误,如上图所示。我没有在本地得到这些错误,现在当我部署之后,我得到了这些错误。请告知,我的代码如下:

 list2=[]
    mainlist=[]
    tables=""
    finalreportlist=[]
    excelbutton=False
    if request.method=='POST':
       
        
        sectionSelected=False
        classSelected= False
        houseselected=False
        sectionwithoutclass=False
        nostudentinlist=False
        nosport=False
            ###checking whether a a class is selected in the form. Part of form processing 
        if request.form["class1"]!='all':
            classSelected= True
                ##form data of class
            formclass=(request.form["class1"])
            ##checking whether a section is entered ###
        if request.form['section']!='all':
            sectionSelected = True
                ###form data of seciton
            formsection=(request.form["section"])

        if request.form["house"] !='all':
            houseselected= True
            formhouse=(request.form["house"])


        ##get sport form data in a loop example first badminton\
        if not request.form.getlist("sport"):
            nosport=True
        if request.form.getlist("sport") and (request.form.get("eventname")):
            flash("Select either the sport or event. Not both",'danger')
        else:
            
            for value in request.form.getlist("sport"):
                    ##getting user ids with given sport
                result1=db.engine.execute("SELECT user_id FROM usersport INNER JOIN sport ON usersport.sport_id=sport.sport_id WHERE sport_name=(?)  ",(value))
        
                    ##adding all user ids to a list
                for a in result1:
                    #print("a",a)            # for appending user ids to a list
                    list2.append(a)
                            
                                #getting all details of the user from that user table
                    query=db.engine.execute("SELECT grrno,firstname,lastname,House,Class,Section,Rollno FROM user  WHERE user.id IN(?)" ,(a))
                            
                                
                                #iterating through users
                    


                        ######query is a list of all user details. b is going though each
                    for b in query:
                        #print("User id is",b)
                        #print("User name is",b.firstname)
                            ##abc contnains each user full object with details 1 by 1
                        abc=b.items()
                            ##contains dictionary of 1 isngle user   looping     
                        dictversion=(dict(abc))
                                    #print("Selected class dictversion is",dictversion["Class"])
                        
                                            
                            ##data in the students class reocrd lika 1,2,3,4
                        classdata=dictversion["Class"]
                            ##data in students secrion record like a,b,c,d
                        sectiondata=dictversion["Section"]
                        
                                    
                            

                        if classSelected==True and sectionSelected == True :

                            if int(classdata)==int(formclass) and formsection==sectiondata:
                                mainlist.append(dictversion)
                                print("Appended in both section and class",mainlist)
                                        

                        if classSelected==True and sectionSelected==False:
                            if int(classdata)==int(formclass) :
                                    mainlist.append(dictversion)
                                    print("Class true section false")

                                        
                        if classSelected==False and sectionSelected==True:
                                
                            sectionwithoutclass=True
                            
                        if classSelected==False and sectionSelected==False:
                            mainlist.append(dictversion)
                            print("Class false section false")
                            

                        #if (sectionSelected==False and classSelected== False) and houseselected==False:
                        #    mainlist.append(dictversion)
                          #  print("All false")
 

                            
                            
                print("\n^^^^^^MAIN LIST^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^",mainlist)                 
            if houseselected==True:
                for element in mainlist:
                    print("Element=",element)
                    print("Final list before if is",finalreportlist)
                                    #print("form data is",formhouse)
                        #print("dict data is",element['House'])
                    if element['House'] ==formhouse:
                        finalreportlist.append(element)
                        print("\nFinal list after if is",finalreportlist)
                            
                                    
            else:
                print("eneterd else")
                finalreportlist=mainlist
         ```                           

共有1个答案

孔城
2023-03-14

Python DB-API连接器包定义了一个名为参数样式的值,该值表示在查询中如何表示VALUES占位符。

Sqlite使用“qmark”样式,因此值由问号表示

q = 'SELECT name FROM users WHERE id = ?'

Psycopg2使用“pyformat”样式“%s”

q = 'SELECT name FROM users WHERE id = %s'

因此,如果您将使用“qmark”样式的查询传递给心理学2执行,您会得到一个错误。

幸运的是,SQLAlChemy提供了一种独立于基础数据库连接器编写原始SQL查询的方法。通过使用“命名”参数样式,并从查询中创建文本对象,SQLAlChemy将自动为基础连接器生成正确的语句。请注意,参数值必须在字典中传递。

import sqlalchemy as sa
...
q = 'SELECT name FROM users WHERE id = :id'
result = engine.execute(sa.text(q), {'id': 42})
 类似资料:
  • 问题内容: 我在遵循MySQL语法指南时遇到语法错误。 我的查询是: 从逻辑上讲,这应该选择,但是我得到了 问题答案: 您的查询仅在存储过程/函数上下文中有效。参见那里以供参考。

  • 问题内容: 我最近在Java PreparedStatements中遇到了此问题。我有以下代码: 方法在哪里 但是,它总是抛出此错误: 当我以幼稚的方式执行“ …”时,不会发生此问题,但我希望以此方式进行。 任何帮助深表感谢。 更新 我尝试了社区的各种建议,例如 仍然出现错误信息。 问题答案: 解决问题的方法实际上非常简单,当您要调用PreparedStatement.executeQuery()

  • 我正在为我的数据库使用Sequelize(6.3.0)和sqlite3(4.2.0),并试图定义以下模型: 它应该在进程启动时定义,但我得到以下错误: 当然,每当我试图对此表执行任何操作时,都会出现以下错误: 我猜问题来自使用数组数据类型的“参与”和“赢家”行。 谢谢你的帮助

  • 问题内容: 我目前在我的Web应用程序中使用jQuery,Twitter Bootstrap和AngularJS。我一直在尝试进行路由,但是`Syntax error, unrecognized expression: 我需要在我的AngularJS路由中使用斜杠(即,并将在我的div中加载不同的内容)。可能是什么原因导致此错误? 问题答案: 我猜在指定目标时要多加斜杠。删除它们,它应该可以正常工

  • 我最近在Java PreparedStatements中遇到了这个问题。我有以下代码: 其中方法是 但是,它一直抛出这个错误: 当我以幼稚的方式做“...

  • 目前遇到此语法错误,错误发布在代码下方。 上面的代码,无法找出if语句上的语法错误。错误消息将很快粘贴为注释

  • 问题内容: 为什么Python在第9行的简单语句中给我一个语法错误? Python的版本是: 问题答案: 在Python 3中,print是一个函数,您需要像这样调用它。

  • 问题内容: 我正在尝试在Go中执行MERGE语句: 但是我得到了这个错误: 在MySQL中也是如此: 怎么了? 问题答案: 不支持,等效的是 插入…在重复的密钥更新上 尝试这个, 但请确保将其设置为或。