Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在SQLAlchemy中过滤列上的SQL查询?_Python_Python 3.x_Sqlite_Sqlalchemy_Flask Sqlalchemy - Fatal编程技术网

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