首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Sqlalchemy查询在崇高文本IDE中成功,但在从命令行执行时失败

问Sqlalchemy查询在崇高文本IDE中成功,但在从命令行执行时失败
EN

Stack Overflow用户
提问于 2016-01-10 17:19:49
回答 1查看 204关注 0票数 0

大家好。我正在为一个使用sqlalchemy和pyqt的大学项目构建相册DB应用程序(因为这两个库都是我想要获得一点经验的库),都是用Python 3编写的。我选择的IDE是project 3,我的数据库服务器是Mariadb,运行在Ubuntu 14.04位变体(初级操作系统)上。

我遇到的问题是安静的,奇怪的,我不知道从这里往哪里走(实际上我以为我已经快完成了!)

如果我从内部崇高(f7)执行应用程序,那么程序按照我所期望的方式运行,所有查询都返回所需的值(因此我认为我几乎完成了)。但是,如果我使脚本可执行,并从命令行或在另一个IDE中执行它(在本例中是Geany),那么它就会分崩离析,但只在尝试根据用户输入提供的筛选参数进行某些查询时才会崩溃。程序其他地方的查询成功,例如Songs.query.all()将返回DB中的所有歌曲。

下面的代码是错误发生在应用程序的“Read”部分的代码片段。“Table”指表对象(歌曲、专辑或艺术家),filter列&子句引用用户输入的字符串参数。

代码语言:javascript
复制
    elif function == 'Read':

        # Debug Print - Display Details
        print('Table is ' + str(table))
        print('Clause is ' + clause)
        # Carry out the Query - Should only return 1 match - Fails Here
        r = table.query.filter(
            getattr(table, column.lower()) == clause).one()

        if self.db == 'Songs':

            # Query Corresponding Album & Artist
            al = Albums.query.get(int(r.album_id))
            ar = Artists.query.get(int(r.artist_id))

            headers = 'Name;Artist;Album;Track Number;Genre'
            data = [r.name, ar.name, al.name,
                    r.track_num, r.genre]

我的模型如下:

代码语言:javascript
复制
    class Artists(Base):
        __tablename__ = 'artists'

        artist_id = Column(Integer, autoincrement=True, primary_key=True)
        name = Column(String(30))

        albums = relationship(
            'Albums', backref='artists', cascade='all, delete-orphan')
        songs = relationship(
             'Songs', backref='artists', cascade='all, delete-orphan')

    class Albums(Base):
        __tablename__ = 'albums'

        album_id = Column(Integer, autoincrement=True, primary_key=True)
        name = Column(String(30), nullable=False)
        artist_id = Column(Integer, ForeignKey('artists.artist_id'))
        created_on = Column(
            DateTime(timezone=True), default=datetime.now, onupdate=datetime.now)

        songs = relationship(
            "Songs", backref="albums", cascade="all, delete-orphan")

    class Songs(Base):
        __tablename__ = 'songs'

        song_id = Column(Integer, autoincrement=True, primary_key=True)
        name = Column(String(50))
        track_num = Column(Integer)
        genre = Column(String(30))
        created_on = Column(
            DateTime(timezone=True), default=datetime.now, onupdate=datetime.now)

        album_id = Column(Integer, ForeignKey('albums.album_id'))
        artist_id = Column(Integer, ForeignKey('artists.artist_id'))

试图匹配DB中存在的歌曲时出现的错误是:

sqlalchemy.exc.ProgrammingError:(_mysql_exceptions.ProgrammingError) (1064 ),“您的SQL语法出现了错误;检查与您的MariaDB服务器版本对应的手册,以便在第3行使用接近'%s‘的正确语法) SQL:’选择songs.song_id作为songs_song_id,选择songs.name作为songs_name,选择songs.track_num作为songs_track_num,选择songs.genre作为songs_genre,使用songs.created_on作为songs_created_on,选择songs.artist_id作为songs_album_id,从歌曲songs.artist_id\n中选择songs.name =%s

​

在这个问题上的任何帮助都将是很棒的,如果有任何额外的信息需要,我将非常乐意提供。提前感谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-01-10 17:49:44

错误是抱怨%s作为绑定参数的语法。如果我没有弄错,MySQL语法使用?表示位置,使用:name表示关键字绑定参数。%s是psycopg2库使用的,因为它做了自己的语句准备。这里没有显示您的引擎配置。

至于从控制台运行和从控制台运行之间的差异,请查找(a)所使用的Python解释器中的任何潜在差异,以及(b)由于PYTHONPATH问题而导致的导入方面的任何潜在差异。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34708435

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档