Python 如何在SQLAlchemy中过滤列上的SQL查询?
我不熟悉烧瓶炼金术。我想对Python 如何在SQLAlchemy中过滤列上的SQL查询?,python,python-3.x,sqlite,sqlalchemy,flask-sqlalchemy,Python,Python 3.x,Sqlite,Sqlalchemy,Flask Sqlalchemy,我不熟悉烧瓶炼金术。我想对LOC\u code列的值过滤SQL查询。我做了db.session.query(schools).filter\u by(LOC\u code='X270').first()。但是编译器返回: (base) C:\Users\antoi\Documents\Programming\musicaltroupefinder>python hello_world.py C:\ProgramData\Anaconda3\lib\site-packages\flask_s
LOC\u code
列的值过滤SQL查询。我做了db.session.query(schools).filter\u by(LOC\u code='X270').first()
。但是编译器返回:
(base) C:\Users\antoi\Documents\Programming\musicaltroupefinder>python hello_world.py
C:\ProgramData\Anaconda3\lib\site-packages\flask_sqlalchemy\__init__.py:835: FSADeprecationWarning: SQLALCHEMY_TRACK_MODIFICATIONS adds significant overhead and will be disabled by default in the future. Set it to True or False to suppress this warning.
'SQLALCHEMY_TRACK_MODIFICATIONS adds significant overhead and '
* Serving Flask app "hello_world" (lazy loading)
* Environment: production
WARNING: This is a development server. Do not use it in a production deployment.
Use a production WSGI server instead.
* Debug mode: off
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
the total number of school is 3281
[2019-12-18 11:08:31,831] ERROR in app: Exception on / [GET]
Traceback (most recent call last):
File "C:\ProgramData\Anaconda3\lib\site-packages\sqlalchemy\util\_collections.py", line 210, in __getattr__
return self._data[key]
KeyError: 'LOC_CODE'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "C:\ProgramData\Anaconda3\lib\site-packages\sqlalchemy\orm\base.py", line 399, in _entity_descriptor
return getattr(entity, key)
File "C:\ProgramData\Anaconda3\lib\site-packages\sqlalchemy\util\_collections.py", line 212, in __getattr__
raise AttributeError(key)
AttributeError: LOC_CODE
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "C:\ProgramData\Anaconda3\lib\site-packages\flask\app.py", line 2446, in wsgi_app
response = self.full_dispatch_request()
File "C:\ProgramData\Anaconda3\lib\site-packages\flask\app.py", line 1951, in full_dispatch_request
rv = self.handle_user_exception(e)
File "C:\ProgramData\Anaconda3\lib\site-packages\flask\app.py", line 1820, in handle_user_exception
reraise(exc_type, exc_value, tb)
File "C:\ProgramData\Anaconda3\lib\site-packages\flask\_compat.py", line 39, in reraise
raise value
File "C:\ProgramData\Anaconda3\lib\site-packages\flask\app.py", line 1949, in full_dispatch_request
rv = self.dispatch_request()
File "C:\ProgramData\Anaconda3\lib\site-packages\flask\app.py", line 1935, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "hello_world.py", line 37, in index
school = db.session.query(schools).filter_by(LOC_CODE='X270').first()
File "C:\ProgramData\Anaconda3\lib\site-packages\sqlalchemy\orm\query.py", line 1800, in filter_by
for key, value in kwargs.items()
File "C:\ProgramData\Anaconda3\lib\site-packages\sqlalchemy\orm\query.py", line 1800, in <listcomp>
for key, value in kwargs.items()
File "C:\ProgramData\Anaconda3\lib\site-packages\sqlalchemy\orm\base.py", line 402, in _entity_descriptor
"Entity '%s' has no property '%s'" % (description, key)
sqlalchemy.exc.InvalidRequestError: Entity 'schools' has no property 'LOC_CODE'
127.0.0.1 - - [18/Dec/2019 11:08:31] "[1m[35mGET / HTTP/1.1[0m" 500 -
这是我的全部代码:
from flask import Flask # pip install flask
from flask import render_template
from flask_sqlalchemy import SQLAlchemy
from sqlalchemy import create_engine, MetaData, Table
from sqlalchemy.orm import mapper, sessionmaker
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///mydb.db'
db = SQLAlchemy(app)
schools = db.Table("schools",db.metadata, autoload = True, autoload_with = db.engine)
@app.route("/")
def index():
results = db.session.query(schools).count()
print("the total number of school is ", db.session.query(schools).count())
school = db.session.query(schools).filter_by(LOC_CODE='X270').first()
print("School's name is", school.SCHOOLNAME)
return render_template("index.html")
@app.route("/map")
def shoelaces():
return "This works now!"
@app.route("/about")
def about():
return "All about my website"
if __name__ == "__main__":
app.run()
但是我不能告诉SQLAlchemy我们很懒,他应该自己学习数据库,我们用这句话:
我是基于but的,他应该通过一行db.Model.metadata.reflect(db.engine)
来了解数据库
上课
我还尝试了一门课:
(base) C:\Users\antoi\Documents\Programming\musicaltroupefinder>python hello_world.py
C:\ProgramData\Anaconda3\lib\site-packages\flask_sqlalchemy\__init__.py:835: FSADeprecationWarning: SQLALCHEMY_TRACK_MODIFICATIONS adds significant overhead and will be disabled by default in the future. Set it to True or False to suppress this warning.
'SQLALCHEMY_TRACK_MODIFICATIONS adds significant overhead and '
* Serving Flask app "hello_world" (lazy loading)
* Environment: production
WARNING: This is a development server. Do not use it in a production deployment.
Use a production WSGI server instead.
* Debug mode: off
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
[2019-12-20 13:03:58,460] ERROR in app: Exception on / [GET]
Traceback (most recent call last):
File "C:\ProgramData\Anaconda3\lib\site-packages\sqlalchemy\engine\base.py", line 1249, in _execute_context
cursor, statement, parameters, context
File "C:\ProgramData\Anaconda3\lib\site-packages\sqlalchemy\engine\default.py", line 580, in do_execute
cursor.execute(statement, parameters)
sqlite3.OperationalError: no such column: schools.LOC_CODE
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "C:\ProgramData\Anaconda3\lib\site-packages\flask\app.py", line 2446, in wsgi_app
response = self.full_dispatch_request()
File "C:\ProgramData\Anaconda3\lib\site-packages\flask\app.py", line 1951, in full_dispatch_request
rv = self.handle_user_exception(e)
File "C:\ProgramData\Anaconda3\lib\site-packages\flask\app.py", line 1820, in handle_user_exception
reraise(exc_type, exc_value, tb)
File "C:\ProgramData\Anaconda3\lib\site-packages\flask\_compat.py", line 39, in reraise
raise value
File "C:\ProgramData\Anaconda3\lib\site-packages\flask\app.py", line 1949, in full_dispatch_request
rv = self.dispatch_request()
File "C:\ProgramData\Anaconda3\lib\site-packages\flask\app.py", line 1935, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "hello_world.py", line 32, in index
school = School.query.filter(School.LOC_CODE == 'X270').all()
File "C:\ProgramData\Anaconda3\lib\site-packages\sqlalchemy\orm\query.py", line 3186, in all
return list(self)
File "C:\ProgramData\Anaconda3\lib\site-packages\sqlalchemy\orm\query.py", line 3342, in __iter__
return self._execute_and_instances(context)
File "C:\ProgramData\Anaconda3\lib\site-packages\sqlalchemy\orm\query.py", line 3367, in _execute_and_instances
result = conn.execute(querycontext.statement, self._params)
File "C:\ProgramData\Anaconda3\lib\site-packages\sqlalchemy\engine\base.py", line 988, in execute
return meth(self, multiparams, params)
File "C:\ProgramData\Anaconda3\lib\site-packages\sqlalchemy\sql\elements.py", line 287, in _execute_on_connection
return connection._execute_clauseelement(self, multiparams, params)
File "C:\ProgramData\Anaconda3\lib\site-packages\sqlalchemy\engine\base.py", line 1107, in _execute_clauseelement
distilled_params,
File "C:\ProgramData\Anaconda3\lib\site-packages\sqlalchemy\engine\base.py", line 1253, in _execute_context
e, statement, parameters, cursor, context
File "C:\ProgramData\Anaconda3\lib\site-packages\sqlalchemy\engine\base.py", line 1473, in _handle_dbapi_exception
util.raise_from_cause(sqlalchemy_exception, exc_info)
File "C:\ProgramData\Anaconda3\lib\site-packages\sqlalchemy\util\compat.py", line 398, in raise_from_cause
reraise(type(exception), exception, tb=exc_tb, cause=cause)
File "C:\ProgramData\Anaconda3\lib\site-packages\sqlalchemy\util\compat.py", line 152, in reraise
raise value.with_traceback(tb)
File "C:\ProgramData\Anaconda3\lib\site-packages\sqlalchemy\engine\base.py", line 1249, in _execute_context
cursor, statement, parameters, context
File "C:\ProgramData\Anaconda3\lib\site-packages\sqlalchemy\engine\default.py", line 580, in do_execute
cursor.execute(statement, parameters)
sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) no such column: schools.LOC_CODE
[SQL: SELECT schools."LOC_CODE" AS "schools_LOC_CODE"
FROM schools
WHERE schools."LOC_CODE" = ?]
[parameters: ('X270',)]
(Background on this error at: http://sqlalche.me/e/e3q8)
127.0.0.1 - - [20/Dec/2019 13:03:58] "[1m[35mGET / HTTP/1.1[0m" 500 -
这是密码
from flask import Flask # pip install flask
from flask import render_template
from flask_sqlalchemy import SQLAlchemy
from sqlalchemy import create_engine, MetaData, Table
from sqlalchemy.orm import mapper, sessionmaker
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///mydb.db'
db = SQLAlchemy(app)
class School(db.Model):
__tablename__ = 'schools'
# __table_args__ = { 'extend_existing': True }
LOC_CODE = db.Column(db.Text, primary_key=True)
@app.route("/")
def index():
school = School.query.filter(School.LOC_CODE == 'X270').first()
print("School's name is", school.SCHOOLNAME)
return render_template("index.html")
通过首先从python控制台运行这些命令,然后启动flask应用程序,我能够克服您的第一个错误。这将创建给定示例中代码使用的数据库。如果您有一个现有的数据库,则需要将URI更改为它所在的位置。您正在使用的URI是将使用此命令创建的URI。我将查看Flask SQLAlchemy文档,以了解如果需要,如何连接到现有数据库
from yourapplication import db
db.create_all()
资料来源:
通过首先从python控制台运行这些命令,然后启动flask应用程序,我能够克服您的第一个错误。这将创建给定示例中代码使用的数据库。如果您有一个现有的数据库,则需要将URI更改为它所在的位置。您正在使用的URI是将使用此命令创建的URI。我将查看Flask SQLAlchemy文档,以了解如果需要,如何连接到现有数据库
from yourapplication import db
db.create_all()
资料来源:
该错误与如何利用
db
或会话有关。在第三个代码段中,配置由School
类处理,散列行对于后续的查询非常重要。在db.engine
配置上使用reflect
方法也很重要。将filter()
切换到filter\u by()
也将产生结果。我已经将.py
文件分为两个,一个用于创建sqlite db,另一个用于Flask
会话。在两个脚本的结束行上都进行了测试,只需进行最小的更改就不会产生错误和预期结果
#create_db.py
from sqlalchemy import create_engine, MetaData, Table, Column, String
from sqlalchemy.orm import mapper, sessionmaker
engine= create_engine('sqlite:///example.db')
metadata = MetaData(engine)
table = Table('schools', metadata,
Column('name', String),
Column('LOC_CODE', String))
metadata.create_all()
ins = table.insert().values(name = 'Victory',
LOC_CODE = 'X270'
)
conn = engine.connect()
conn.execute(ins)
Session = sessionmaker(bind=engine)
session = Session()
schools = table
# Test session below
results = session.query(schools).count()
filt = session.query(schools).filter_by(LOC_CODE='X270').first()
print(results)
print(filt)
该错误与如何利用db
或会话有关。在第三个代码段中,配置由School
类处理,散列行对于后续的查询非常重要。在db.engine
配置上使用reflect
方法也很重要。将filter()
切换到filter\u by()
也将产生结果。我已经将.py
文件分为两个,一个用于创建sqlite db,另一个用于Flask
会话。在两个脚本的结束行上都进行了测试,只需进行最小的更改就不会产生错误和预期结果
#create_db.py
from sqlalchemy import create_engine, MetaData, Table, Column, String
from sqlalchemy.orm import mapper, sessionmaker
engine= create_engine('sqlite:///example.db')
metadata = MetaData(engine)
table = Table('schools', metadata,
Column('name', String),
Column('LOC_CODE', String))
metadata.create_all()
ins = table.insert().values(name = 'Victory',
LOC_CODE = 'X270'
)
conn = engine.connect()
conn.execute(ins)
Session = sessionmaker(bind=engine)
session = Session()
schools = table
# Test session below
results = session.query(schools).count()
filt = session.query(schools).filter_by(LOC_CODE='X270').first()
print(results)
print(filt)
在第二次尝试中,您将通过类创建学校
表和学校
表。尝试使用类的tablename参数组合它们。@Attack68当然,它会更改第二次尝试中的错误消息。您正在通过类创建学校
表和学校
表。尝试使用类的tablename参数组合它们。@Attack68当然,它会更改错误消息,因为我有一个现有数据库。它与脚本位于同一文件夹中。但是,即使在指定mydb.db的完整路径时,我仍然会遇到相同的错误。@IggyPass数据库文件有问题。我尝试了几种创建数据库的方法,包括教程中包含的方法,它们都可以工作。我会仔细阅读教程,并尝试使用TablePlusOkay进行创建,我正在学习。但是,即使没有在上导入重复项,我也无法使用再次创建表TablePlus@IggyPass您当前的错误是什么?你把所有的东西都改成文本了吗?我排除了在我的codeOn TablePlus中使用reflect方法<代码>创建表失败
我有一个现有数据库。它与脚本位于同一文件夹中。但是,即使在指定mydb.db的完整路径时,我仍然会遇到相同的错误。@IggyPass数据库文件有问题。我尝试了几种创建数据库的方法,包括教程中包含的方法,它们都可以工作。我会仔细阅读教程,并尝试使用TablePlusOkay进行创建,我正在学习。但是,即使没有在上导入重复项,我也无法使用再次创建表TablePlus@IggyPass您当前的错误是什么?你把所有的东西都改成文本了吗?我排除了在我的codeOn TablePlus中使用reflect方法<代码>创建表失败
感谢您的回答,我仍然无法将其应用到您可以找到的数据库文件中。我不认为它编码错误,我用第三个脚本combined.py
更新了答案。删除用于从csv创建db的哈希行。它会产生预期的结果。谢谢,在这种情况下,csv文件中的两列将产生一些问题,因为它们与其他两列重复。我怎么能跳过它们?(在df前面是city
和address
)。要删除sql
行,可以删除列df.drop(columns=['address2','city2'])
或df.drop(['address2','city2'],axis=1)
。感谢您的回答,我仍然无法将其应用到您可以找到的数据库文件中。我不认为它编码错误,我用第三个脚本combined.py
更新了答案。删除用于从csv创建db的哈希行。它会产生预期的结果。谢谢,在这种情况下,csv文件中的两列将产生一些问题,因为它们与其他两列重复。我怎么能跳过它们?(在df前面是city
和address
)。要删除sql
行,可以删除列<代码>测向下降(colu
#combined.py
from flask import Flask
from flask import render_template
from flask_sqlalchemy import SQLAlchemy
from sqlalchemy import create_engine, MetaData, Table, Column, String
import sqlite3
import pandas as pd
#data = 'schools-geocoded - schools-geocoded.csv'
#df = pd.read_csv(data)
#con = sqlite3.connect('example2.db')
#df.to_sql("schools", con)
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///example2.db'
db = SQLAlchemy(app)
db.Model.metadata.reflect(db.engine)
class School(db.Model):
__tablename__ = 'schools'
__table_args__ = {'extend_existing': True}
LOC_CODE = db.Column(db.Text, primary_key = True)
@app.route("/")
def hello():
print("Total number of schools is", School.query.count())
school = School.query.filter_by(LOC_CODE='X270').first()
print(school.SCHOOLNAME)
hello()