Sqlalchemy查询在Sublime Text IDE中成功但在从命令行

时间:2016-01-10 17:19:49

标签: python-3.x sqlalchemy mariadb

嘿大家好我正在使用sqlalchemy和pyqt为大学项目构建Albums DB应用程序(因为这两个库都是我希望获得一些经验的库),所有这些都是用Python 3编写的。 我选择的IDE是Sublime 3,我的数据库服务器是运行在Ubuntu 14.04 64位变体(Elementary OS)上的Mariadb。

我遇到的问题很安静,而且我不知道从哪里开始(我实际上以为我差不多完了,呃!)。

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

下面的代码是“阅读”中出现错误的片段。申请部分。 '表'表格对象(歌曲,专辑或艺术家)和过滤栏&子句引用用户输入的字符串参数。

    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]

我的模型如下:

    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'))

尝试匹配数据库中存在的歌曲时出错:

  

sqlalchemy.exc.ProgrammingError:(_ mysql_exceptions.ProgrammingError)(1064,"您的SQL语法中有错误;请查看与您的MariaDB服务器版本对应的手册,以便在&#39附近使用正确的语法;%s'在第3行")[SQL:' SELECT songs.song_id AS songs_song_id,songs.name AS songs_name,songs.track_num AS songs_track_num,songs.genre AS songs_genre,songs.created_on AS songs_created_on ,songs.album_id AS songs_album_id,songs.artist_id AS songs_artist_id \ nFROM songs \ nWHERE songs.name =%s'] [参数:(' WHAT WENT DOWN',)]

对此问题的任何帮助都会很精彩,如果需要任何其他信息,我将非常乐意提供。提前致谢

1 个答案:

答案 0 :(得分:0)

错误是抱怨%s的语法作为绑定参数。如果我没弄错的话,MySQL语法使用?表示位置,:name表示关键字绑定参数。 %spsycopg2库使用的,因为它自己进行语句准备。此处未显示您的引擎配置。

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