标签: sqlalchemy

Sqlalchemy 之上的抽象层

我在一个使用 Sqlalchemy 的 Python 3.6 项目中,我们希望在 Sqlalchemy 上有另一个抽象层。如果需要,这将使我们能够更轻松地将 Sqlalchemy 替换为另一个库。

在这个例子中,它是DbHelper类:

数据库助手.py

from dbconn import dbconn
from models.animals import Dogs

class DbHelper():
    @staticmethod
    def get_dog_by_nickname(nickname):
        return dbconn.session.query(Dogs).get(nickname)
Run Code Online (Sandbox Code Playgroud)

主文件

from dbhelper import DbHelper

class Dog():
    def __init__(self, nickname, breed, age):
        self.nickname = nickname
        self.breed = breed
        self.age = age

    @classmethod
    def using_nickname(cls, nickname):
        row = DbHelper.get_dog_by_nickname(nickname)
        return Dog(row.id, row.breed, row.age)

dog = Dog.using_nickname('Tom')
Run Code Online (Sandbox Code Playgroud)

问题:有没有比创建DbHelper类用作容器并只staticmethod在其中包含更好的方法?我读过这不是pythonic。

当我们这样做时,将所有staticmethod函数转换dbhelper.py为常规方法将填充命名空间from dbhelper import *

python sqlalchemy python-3.x

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

使用 Windows 身份验证在 Python 中使用 SQL Alchemy 连接到网络上的 MS SQL

我正在尝试使用 pandas.read_sql_table 从 MS SQL Server 获取数据(服务器在网络上)。我使用 Windows 身份验证来访问服务器。Pandas read_sql_table 将 SQL Alchemy 连接作为“连接”的参数。我很难找到一个结合了以下内容的示例:

  1. SQL 炼金术
  2. 微软 SQL 服务器
  3. DSN(根据 SQL Alchemy 的“首选”规范)
  4. Windows 身份验证

我咨询了 SQL Alchemy,它显示了一个使用 SQL 身份验证的示例,但没有使用 Windows 身份验证。http://docs.sqlalchemy.org/en/latest/dialects/mssql.html#connecting-to-pyodbc 以下是我尝试过的各种选项。都返回错误。

import pandas as pd
from sqlalchemy import create_engine
import pyodbc
# set some variables
dbname = 'mydbname'
schemaname = 'myschemaname'
servername = 'myservername'
tablename = ‘mytablename’

sqlcon = create_engine('mssql+pyodbc://@' + servername)
#sqlcon = create_engine('mssql+pyodbc://' + servername + '/' + dbname)
#sqlcon = create_engine('mssql+pyodbc://' + servername)
#sqlcon …
Run Code Online (Sandbox Code Playgroud)

python sql-server sqlalchemy pyodbc

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

将变量绑定到 Pandas.read_sql 的 SQLAlchemy 查询

是否可以将变量绑定到 Pandas.read_sql 语句中使用的 SQLAlchemy 查询?

在 WHERE 子句中使用 %s 不起作用,cx_Oracle 的文档指出:

cursor.execute('SELECT * FROM Employees WHERE Department_id=:dept_id)

直接使用 cx_Oracle 驱动程序在 Pandas 中已被弃用,并且不是一个可行的选项。

我有一个组列表,我需要遍历 WHERE 语句,因为 SELECT * 内存太大而无法在单台 PC 上处理。

例子:

SELECT * FROM DUAL WHERE GROUP_NAME = %s

返回此错误:

(cx_Oracle.DatabaseError) ORA-00911: 无效字符... WHERE GROUP_NAME = %s

python cx-oracle sqlalchemy oracle11g pandas

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

SQLAlchemy 在 filter_by 之后动态更新行中的值

我是 python 和 SQLAlchemy 的新手。我在python 3

我创建了一个类testtbl 来操作表。一个功能是update 我通过的地方:

myfilter = {'origin_source_id':'MX01’}.

mysql表中找到这一行origin_source_id = ‘MX01'

updatevalue = {'origin_source_id':'CAL01’}

将找到的 origin_source_id 替换为 'CAL01;

电话

testtbl.update_row(myfilter,updatevalue)
Run Code Online (Sandbox Code Playgroud)

功能

def update_row(self,locaterowfilter,updatevalue):
    self.Session.query( self.TableClass ).filter_by( **locaterowfilter ).update( updatevalue )
Run Code Online (Sandbox Code Playgroud)

我收到以下错误

target_cls = query._mapper_zero().class_ 
AttributeError: 'NoneType' object has no attribute ‘class_’
Run Code Online (Sandbox Code Playgroud)

我不知道如何处理它。

有没有更好的方法来做到这一点?

python sqlalchemy

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

熊猫:“与 MySQL 服务器的连接丢失”“系统错误:32 管道损坏”

尝试导入熊猫数据框时出现上述错误:

import pandas as pd
from sqlalchemy import create_engine
engine = create_engine('mysql://username:password@localhost/dbname')
c = getsomedata()
fields = ['user_id', 'timestamp', 'text']
c1 = c[fields].reset_index()
c1.to_sql(name='comments', con=engine, if_exists='replace', index=False)
Run Code Online (Sandbox Code Playgroud)

这个 MySql 问题有很多问题 - 但是如何通过 Pandas 导入来解决?

python mysql sqlalchemy pandas

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

使 QuerySelectField 选定的数据对象变成文字值

我正在创建我的应用程序的一部分,管理员可以在其中注册用户。我有一个注册表单,其中表单的一个元素是QuerySelectField从 db 获取用户也可以链接的位置列表。我可以显示QuerySelectField正确的信息,但在提交表单时出现错误

Sqlalchemy.exc.ArgumentError:对象“站点”作为 SQL 文字值不合法

尝试在我的表单站点模型中查询数据库以查找所选选项的名称时会出现此错误,QuerySelectField以便我可以将特定站点的 ID 存储在变量中以供进一步使用。

我不确定如何使对象成为 sqlalchemy 可以读取的文字值。我尝试将它包装在 str() 中,但这没有任何作用。顺便说一下,我是个菜鸟,所以我仍在努力了解烧瓶的某些元素。

这是我要完成的工作的表格

def site():
    return Sites.query.all()

class RegistrationForm(FlaskForm):
    username = StringField('Username', validators=[DataRequired(), 
Length(min=2, max=20)])
    email = StringField('Email', validators=

[DataRequired(), Email()])
        password = PasswordField('Password', validators=[DataRequired()])
        confirm_pass = PasswordField('Confirm Password', validators= 
   [DataRequired(), EqualTo('password')])
        admin_status = BooleanField('Check for Admin Status')
        sitechoices = QuerySelectField(query_factory=site, allow_blank=False, 
   get_label='sitename')
Run Code Online (Sandbox Code Playgroud)

这是我的 routes.py 中的路线信息

@app.route('/register', methods=['POST', 'GET'])
@login_required
def register():
    forms = RegistrationForm()
    if forms.validate_on_submit():
        hashed_pw = bcrypt.generate_password_hash(forms.password.data).decode('utf-8')
        siteid = …
Run Code Online (Sandbox Code Playgroud)

python sqlalchemy flask

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

不可 JSON 序列化 - Python + Flask + Sqlalchemy

我正在编写小查询以从mysql数据库中获取数据,我有一个报告表,在里面我有report_id,我需要查询匹配report_id来自apiparams的数据。

我的功能:

def view_single_thumbnail(idx): // idx coming from params 
    session = Session()

    result = session.query(
        Report
    ).filter(
        Report.report_id == idx
    ).all()

    return jsonify({
        'data': result
    })
Run Code Online (Sandbox Code Playgroud)

投掷错误:'components.db.core.table_declaration.Report object at 0x000001C1Fsdfsdf51E6A90' is not JSON serializable

python mysql json sqlalchemy flask

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

PostgreSQL SQLalchemy 和时间戳带时区,为什么隐身与正常不同?

我正在使用 Flask sqlalchemy 和 postgreSQL 并且显示的日期时间有问题,在调查这个问题时我发现了另一个奇怪的事情:

在隐身模式(chrome 浏览器选项卡)下创建数据库条目会给出不同/错误的时间。编辑:它与隐身模式无关,这两种情况也发生在正常模式下。我还没有弄清楚为什么。

这是代码:

我更改了数据库的默认时区:

ALTER DATABASE postgres SET timezone TO 'Europe/Berlin';
Run Code Online (Sandbox Code Playgroud)

该模型:

class User(UserMixin, Base):
    __tablename__ = 'users'
    date_added = Column(DateTime(timezone=True), nullable=False)
Run Code Online (Sandbox Code Playgroud)

我用来将日期时间添加到数据库的方法:

date_added=datetime.today()
Run Code Online (Sandbox Code Playgroud)

它在数据库中的外观(此时我的本地时间是 13:53:46):

不在隐身模式下创建条目

timestamp with time zone
2019-02-01 13:53:46.73817+01
Run Code Online (Sandbox Code Playgroud)

在隐身模式下创建条目

timestamp with time zone
2019-02-01 12:53:46.73817+01
Run Code Online (Sandbox Code Playgroud)

这真的让我担心。这是错误的。即使我将日期时间对象转换为本地时间。两个条目同时完成,但显示不同的结果,这怎么可能?

同样在 HTML 中查看这些日期时,postgreSQL 不会应用偏移量,因此第一个日期看起来正确,但第二个日期是错误的。

最初我只是想找到一种方法来在欧洲/柏林存储所有日期时间对象并在欧洲/柏林时间返回它们,所以我不必将 UTC 转换为欧洲/柏林,但现在我认为出现了可怕的错误。

我也到处都仔细检查了我的代码,我没有使用其他方法来操作日期时间对象。

编辑

每次用户登录时,我都会保存一个日期时间。目前我在非隐身模式下尝试过。我的本地时间是14:13:33但它保存到数据库中: 2019-02-01 13:13:33.804339+01。这怎么可能?我知道它不能是随机的,但现在看起来它的保存时间是随机的,有时是带有偏移量的 UTC,有时是带有偏移量的欧洲/柏林。

编辑

我仔细检查了所有有问题的表格SHOW timezone;,它们都正确返回Europe/Berlin

python postgresql timezone datetime sqlalchemy

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

SQLAlchemy AmbiguousForeignKeysError

我已经搜索了这个错误,但什么也看不懂。我收到以下错误:

sqlalchemy.exc.AmbiguousForeignKeysError:无法确定关系 Sale.payments 上的父/子表之间的连接条件 - 有多个外键路径链接表。指定“foreign_keys”参数,提供应被视为包含对父表的外键引用的列的列表。

这是我的代码:

# -*- coding: utf-8 -*-

import sqlalchemy as sa
import bcrypt as bc
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import scoped_session, sessionmaker, relationship, backref
from sqlalchemy_utils import database_exists, create_database

engine = sa.create_engine('sqlite:///data/db/nestopol.db')
if not database_exists(engine.url):
    create_database(engine.url)

session = scoped_session(sessionmaker(bind=engine))
Base = declarative_base()


class Staff(Base):

    __tablename__ = 'staffs'

    staff_id = sa.Column(sa.Integer, primary_key=True)
    username = sa.Column(sa.String(64), unique=True, index=True, nullable=False)

    # Needs a length if MySQL is used
    # password is 93 in length
    password = …
Run Code Online (Sandbox Code Playgroud)

python sqlalchemy

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

为什么 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
查看次数