小编Sup*_*oot的帖子

当实例分配给关系时,sqlalchemy before_flush 事件处理程序看不到外键的变化

我有一个before_flush事件侦听器,用于检查员工的经理是否更改。在这种情况下,会在EmpManHist表中自动创建记录。manager是对Employee表的自引用。这是我的表定义:

class Employee(Base):
    __tablename__ = 'employees'

    emp_id = Column(String, primary_key=True, unique=True)
    name = Column(String, nullable=False)
    manager_id = Column(String, ForeignKey('employees.emp_id'))
    direct_reports = relationship('Employee', backref=backref('manager', remote_side=[emp_id]))
Run Code Online (Sandbox Code Playgroud)

当我通过manager_id直接修改 ForeignKey ( )将新经理分配给员工时,它会被事件侦听器正确拾取。但是当我进行实例分配时,它不会:

# this code does not pick up the manager_id change in the 'before_flush' event listener
emp2.manager = emp3
dal.session.add(emp2)
dal.session.commit()

# this does
emp2.manager_id = '1'
dal.session.add(emp2)
dal.session.commit()
Run Code Online (Sandbox Code Playgroud)

这是为什么?我正在使用 python 3.6.3 和 sqlalchemy 1.1.13

以下是完整的工作示例:

from sqlalchemy import create_engine, Column, Integer, String, …
Run Code Online (Sandbox Code Playgroud)

python sqlalchemy

3
推荐指数
1
解决办法
2467
查看次数

SQLAlchemy“ AttributeError:'str'对象没有属性'c'”

我有一个名为两个表users,并permissions和我想创建一个使用指定表它们之间的关系userPermissions。这是我的代码的样子:

类User(Base):
    __tablename__ ='用户'

    id =列(整数,primary_key = True)
    first_name =列(文本)
    last_name = Column(文本,nullable = True)

类Permission(Base):
    __tablename__ ='权限'

    id =列(整数,primary_key = True)
    标题=列(String(64))
    allow_anonymous =列(布尔)

类UserPermission(Base):
    __table__ ='userPermissions'

    id =列(整数,primary_key = True)
    user_id =列(整数,ForeignKey('users.id'))
    Permission_id = Column(整数,ForeignKey('permissions.id'))
    值=列(布尔)

我知道我可能做错了人际关系,但是通过文档和搜索进行搜索,我找不到它是什么。当我尝试使用db.Base.metadata.create_all(db.engine)它创建表时,出现以下错误:

/usr/bin/python3.6 /path/project/out.py
Traceback (most recent call last):
  File "/path/project/out.py", line 1, in <module>
    from components.database import setup
  File "/path/project/components/database/__init__.py", line 41, in <module>
    class UserPermission(Base):
  File "/home/user/.local/lib/python3.6/site-packages/sqlalchemy/ext/declarative/api.py", line 65, in __init__
    _as_declarative(cls, classname, …
Run Code Online (Sandbox Code Playgroud)

python sqlalchemy

3
推荐指数
1
解决办法
1422
查看次数

将查询输出作为输入传递给 SQLAlchemy 中另一个查询的 in 子句

我有 2 个表(比如StudentCollege)和第三个表(StudentCollege),其中有student_idcollege_id外键。

我想给出以下查询的输出:

list = (
    db.session.query(StudentCollegeModel.College_id)
    .filter(StudentCollegeModel.student_id== student_id)
    .all()
)
Run Code Online (Sandbox Code Playgroud)

以下查询:

(
    db.session.query(CollegeModel)
    .filter(CollegeModel.College_id.in_(list))
    .all()
)
Run Code Online (Sandbox Code Playgroud)

但它给出了编程错误。

python sqlalchemy flask-sqlalchemy

3
推荐指数
1
解决办法
813
查看次数

SQLAlchemy 警告:列将不是声明性映射的一部分

尝试使用 python、flask 和 sqlalchemy 构建待办事项列表应用程序;在为数据库创建表时,我收到此错误

我运行这个命令

'from app import db'
Run Code Online (Sandbox Code Playgroud)

我收到此警告:

C:\Users\Mahmoud\.virtualenvs\to-do_list_flask-Gr0Wv-V5\lib\site-packages\sqlalchemy\ext\declarative\base.py:361: SAWarning: Attribute 'item' on class <class 'app.todo'> appears to be a non-schema 'sqlalchemy.sql.column()' object; this won't be part of the declarative mapping
  % (key, cls)
C:\Users\Mahmoud\.virtualenvs\to-do_list_flask-Gr0Wv-V5\lib\site-packages\sqlalchemy\ext\declarative\base.py:361: SAWarning: Attribute 'date' on class <class 'app.todo'> appears to be a non-schema 'sqlalchemy.sql.column()' object; this won't be part of the declarative mapping
  % (key, cls)
Run Code Online (Sandbox Code Playgroud)

如果我执行db.create_all()该表只有一个 id 列

我的脚本:

from flask import Flask, render_template, request
from flask_sqlalchemy import SQLAlchemy

app …
Run Code Online (Sandbox Code Playgroud)

python sqlalchemy

3
推荐指数
1
解决办法
2100
查看次数

AttributeError: 'str' 对象没有属性 '_sa_instance_state'

我想评估链接到两个不同用户的值。我创建了一个不同的表来跟踪用户以前的体验和他们感兴趣的体验,并将它们与用户联系起来。我有一个匹配函数试图找到最相似的用户,但它给出了标题中列出的属性错误。

模型:

class User(UserMixin, db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(64), index=True, unique=True)
    prev = db.relationship('prevExp', backref='user', lazy='dynamic')
    interested = db.relationship('interestedExp', backref='user', 
                                 lazy='dynamic')
    matches = db.relationship('Match', backref='matchedTo', lazy='dynamic')

class prevExp(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    arts = db.Column(db.String(1))
    consulting = db.Column(db.String(1))
    dataScience = db.Column(db.String(1))
    education = db.Column(db.String(1))
    engineering = db.Column(db.String(1))
    finance = db.Column(db.String(1))
    government = db.Column(db.String(1))
    law = db.Column(db.String(1))
    management = db.Column(db.String(1))
    marketing = db.Column(db.String(1))
    medical = db.Column(db.String(1))
    technology = db.Column(db.String(1))
    expDescription = db.Column(db.String(400))
    userID = db.Column(db.Integer, db.ForeignKey('user.id'))

class interestedExp(db.Model): …
Run Code Online (Sandbox Code Playgroud)

python sqlalchemy flask flask-sqlalchemy

2
推荐指数
1
解决办法
6201
查看次数

SQLAlchemy bulk_insert_mappings():无法获取表“test”的映射器

我一直在尝试使用 sqlalchemy 的 bulk_insert_mappings。我知道我可以创建会话并连接到数据库。我已经初始化了我的引擎,但我似乎无法从表中获得我需要的映射器。

from sqlalchemy import create_engine
from sqlalchemy.orm.session import sessionmaker,Session
from sqlalchemy_utils import get_mapper

engine = create_engine('mysql+pymysql://{}:{}@IP:PORT/'.format(USER,PW)) # removed my config here
connection = engine.connect()
m = MetaData(bind=engine,schema='test')
m.reflect()

Session = sessionmaker(bind=engine)
s = Session()
s.bulk_insert_mappings(get_mapper(m.tables['test.test']), pd.DataFrame({'a':['a','b','c']}).to_dict(orient="records"))
s.commit()
s.close()
Run Code Online (Sandbox Code Playgroud)

我最近在这个问题上发现了一堆相关的问题

SQLAlchemy 从 Table 对象中获取 Mapper 对象(来自 Metadata 或 Session 或其他)

但 sqlalchemy_utils.get_mapper 提出:

“ValueError: 无法获得表 'test' 的映射器。”

sqlalchemy.orm.mapperlib._mapper_registry似乎是空的。也许是因为我没有将它绑定到我的引擎上。但不知道该怎么做。

PS:test是一个非常简单的TEXT类型的单列表

这是 m.tables['test.test'] 的输出

Table('test', MetaData(bind=Engine(mysql+pymysql://USER:***@IP:PORT/)), Column('a', TEXT(), table=<test>), schema='test')
Run Code Online (Sandbox Code Playgroud)

python mysql sqlalchemy mariadb sqlalchemy-utils

2
推荐指数
1
解决办法
2740
查看次数

SQLAlchemy无法在更新值时设置属性错误

mailtable在后端PostgreSQL数据库中有一个表,并且正在使用SQLAlchemy ORM使用给定的查询它mailId。对于以下代码,amEngine已经设置了。当到达该mailRow.usercomment = 'Hello World'行时,它抛出:

AttributeError:无法设置属性

Base = declarative_base()
Base.metadata.reflect(amEngine)
metaAm = MetaData()
metaAm.reflect(bind=amEngine)
mt = metaAm.tables['mailtable']
Session = sessionmaker(bind=amEngine)
amSession = Session()
mailRow = amSession.query(
        mt
    ).filter(
        mt.c.id == mailId
    ).first()
mailAddress = mailRow.address
mailRow.usercomment = 'Hello World'
amSession.flush()
amSession.commit()
Run Code Online (Sandbox Code Playgroud)

我需要阅读该address列(成功)并更新该usercomment列(引发异常)。两列的PostgreSQL类型均为text。我怎样才能做到这一点?我确信这肯定是一个非常简单的问题,但是对于我一生来说,我看不到这个问题。

非常感谢。

python postgresql sqlalchemy

1
推荐指数
1
解决办法
1343
查看次数

SQLALchemy 增加了显着的过载。SQLAlchemy 对象没有属性“dateTime”

我的代码有问题,尝试使用 python 在 Flask 中设置 SQLAlchemy 数据库。代码:

谢谢您的帮助。

尝试重新安装 SQLAlchemy。

我使用的是公司笔记本电脑,应该不会有问题吧?

from flask import Flask, render_template, url_for
from flask_sqlalchemy import SQLAlchemy
from datetime import datetime

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///test.db'
db = SQLAlchemy(app)

class Todo(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    content = db.Column(db.String(200), nullable=False)
    date_created = db.Column(db.DateTime, default=datetime

def __repr__(self):
    return '<Task %r>' % self.id

@app.route('/', methods=['POST', 'GET'])
def index():
    return render_template('index.html')

if __name__ == "__main__":
    app.run(debug=True)
(env) C:\Users\rodrigs\Documents\PythonFlaskApp>app.py
C:\Users\rodrigs\Documents\PythonFlaskApp\env\lib\site-packages\flask_sqlalchemy\__init__.py:835: FSADeprecationWarning: SQLALCHEMY_TRACK_MODIFICATIONS adds significant overhead and will be disabled by …
Run Code Online (Sandbox Code Playgroud)

python sqlalchemy flask-sqlalchemy

1
推荐指数
1
解决办法
4390
查看次数

Flask-SQLAlchemy:如何向 create_engine() 传递参数,例如 pool_size?

一个菜鸟困惑的问题:

如何以及在哪里设置 pool_size?

我发现在文档中将池大小设置为:

engine = create_engine('postgresql://me@localhost/mydb',
                       pool_size=20, max_overflow=0)
Run Code Online (Sandbox Code Playgroud)

,但是有没有办法为下面的代码片段设置 pool_size ,如果是的话很高兴知道如何?

from flask import Flask
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:root@localhost/testdb'
db = SQLAlchemy(app)


class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True, nullable=False)
    email = db.Column(db.String(120), unique=True, nullable=False)

    def __repr__(self):
        return '<User %r>' % self.username
    ......
    ......
Run Code Online (Sandbox Code Playgroud)

错误如下:

sqlalchemy.exc.TimeoutError: QueuePool limit of size 10 overflow 10 reached, connection timed out, timeout 30 
Run Code Online (Sandbox Code Playgroud)

python flask-sqlalchemy

1
推荐指数
1
解决办法
5040
查看次数

为什么 SQLAlchemy 在查询中标记列

当我在 SQLAlchemy 中进行查询时,我注意到查询对每一列使用 AS 关键字。它为每一列设置alias_name= column_name

例如,如果我运行命令print(session.query(DefaultLog)),它会返回:

注意:DefaultLog是我的表对象。

SELECT default_log.id AS default_log_id, default_log.msg AS default_log_msg, default_log.logger_time AS default_log_logger_time, default_log.logger_line AS default_log_logger_line, default_log.logger_filepath AS default_log_logger_filepath, default_log.level AS default_log_level, default_log.logger_name AS default_log_logger_name, default_log.logger_method AS default_log_logger_method, default_log.hostname AS default_log_hostname
FROM default_log
Run Code Online (Sandbox Code Playgroud)

为什么它使用别名 = 原始名称?有什么方法可以禁用这种行为吗?

先感谢您!

python sqlalchemy

0
推荐指数
1
解决办法
1557
查看次数

是否可以将字典传递到 SQLAlchemy 中的 create_engine 函数中?

我正在尝试启动与 Azure SQL 数据库的连接。出于安全原因,我无法硬编码用户名和密码,我需要从配置文件中的字典中获取它,并以这种方式将其放入连接 URL 中。

当我尝试这样做并在 Jupyter 笔记本中运行它时, 并{key[value]}没有被配置文件中引用的内容替换。

如果我使用格式化字符串,我会得到一个KeyError. 如果我不使用格式化字符串,它只会打印{variablename}字面意思。

python sqlalchemy

0
推荐指数
1
解决办法
3132
查看次数

MultiFileField 不返回文件,返回 _str_

我正在尝试使用 Flask 中的 WTForms 使用“MultiFileField”上传多个图像,但是,它返回一个字符串而不是文件对象。所以我尝试使用以下内容:

request.files.getlist(form.upload_field.data)
Run Code Online (Sandbox Code Playgroud)

但它返回一个空列表,所以无论如何我可以处理这个将照片保存到目录中

python file-upload flask flask-wtforms

0
推荐指数
1
解决办法
346
查看次数