我有一个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) 我有一个名为两个表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) 我有 2 个表(比如Student和College)和第三个表(StudentCollege),其中有student_id和college_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、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) 我想评估链接到两个不同用户的值。我创建了一个不同的表来跟踪用户以前的体验和他们感兴趣的体验,并将它们与用户联系起来。我有一个匹配函数试图找到最相似的用户,但它给出了标题中列出的属性错误。
模型:
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) 我一直在尝试使用 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) 我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 在 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) 一个菜鸟困惑的问题:
如何以及在哪里设置 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) 当我在 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)
为什么它使用别名 = 原始名称?有什么方法可以禁用这种行为吗?
先感谢您!
我正在尝试启动与 Azure SQL 数据库的连接。出于安全原因,我无法硬编码用户名和密码,我需要从配置文件中的字典中获取它,并以这种方式将其放入连接 URL 中。
当我尝试这样做并在 Jupyter 笔记本中运行它时, 并{key[value]}没有被配置文件中引用的内容替换。
如果我使用格式化字符串,我会得到一个KeyError. 如果我不使用格式化字符串,它只会打印{variablename}字面意思。
我正在尝试使用 Flask 中的 WTForms 使用“MultiFileField”上传多个图像,但是,它返回一个字符串而不是文件对象。所以我尝试使用以下内容:
request.files.getlist(form.upload_field.data)
Run Code Online (Sandbox Code Playgroud)
但它返回一个空列表,所以无论如何我可以处理这个将照片保存到目录中