大家好。我正在为一个使用sqlalchemy和pyqt的大学项目构建相册DB应用程序(因为这两个库都是我想要获得一点经验的库),都是用Python 3编写的。我选择的IDE是project 3,我的数据库服务器是Mariadb,运行在Ubuntu 14.04位变体(初级操作系统)上。
我遇到的问题是安静的,奇怪的,我不知道从这里往哪里走(实际上我以为我已经快完成了!)
如果我从内部崇高(f7)执行应用程序,那么程序按照我所期望的方式运行,所有查询都返回所需的值(因此我认为我几乎完成了)。但是,如果我使脚本可执行,并从命令行或在另一个IDE中执行它(在本例中是Geany),那么它就会分崩离析,但只在尝试根据用户输入提供的筛选参数进行某些查询时才会崩溃。程序其他地方的查询成功,例如Songs.query.all()将返回DB中的所有歌曲。
下面的代码是错误发生在应用程序的“Read”部分的代码片段。“Table”指表对象(歌曲、专辑或艺术家),filter列&子句引用用户输入的字符串参数。
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'))试图匹配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
在这个问题上的任何帮助都将是很棒的,如果有任何额外的信息需要,我将非常乐意提供。提前感谢
发布于 2016-01-10 17:49:44
错误是抱怨%s作为绑定参数的语法。如果我没有弄错,MySQL语法使用?表示位置,使用:name表示关键字绑定参数。%s是psycopg2库使用的,因为它做了自己的语句准备。这里没有显示您的引擎配置。
至于从控制台运行和从控制台运行之间的差异,请查找(a)所使用的Python解释器中的任何潜在差异,以及(b)由于PYTHONPATH问题而导致的导入方面的任何潜在差异。
https://stackoverflow.com/questions/34708435
复制相似问题