-
Notifications
You must be signed in to change notification settings - Fork 138
feat: Add support for SQLAlchemy 1.4 #177
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
The source of the dependency bug is in old versions of google-cloud-core that depend on too-old versions of google-api-core.
Some tests are still failing, but we're far enough along that we have the right shape, I think.
Other fixes: - Handle BIGINT - Fix string leteral formatting (and start type-specific adaptations).
The SQLAlchemy like convenience functions (e.g. ) escape incorrectly for BigQuery, so re-escape.
We could make that work, if we want to. :)
…ry keys, etc., that BigQuery doesn't have.
The source of the dependency bug is in old versions of google-cloud-core that depend on too-old versions of google-api-core.
So we don't have t mock at the api level.
- Run tests in temporary directory rather than sharing memory connections. Because simpler. :) - Introduce cross-connection state and record queries in it, so tests can make assertions bout generated queries.
…laceholder The BigQuery Python Client supports an extended placeholder syntax that includes type information, as in `%(foo:INT64)s` (named) or `%(:INT64)s` (unnamed). When we know the type, include it in the placeholder.
The numeric tests now tun since we started passing type info from sqla to bigquery. The CTE tests test features that don't exist in bigquery.
Although the test isn't actually testing dialect code. Maybe it should be skipped instead. Also set the profile test pasth to a more reasonable value, although it doesn't seem to be used. <shrug>
Also inlined colspecs code, because there wasn't much and it facilitated separating literal processing into a function.
testing/constraints-3.9.txt
Outdated
@@ -0,0 +1,3 @@ | |||
sqlalchemy>=1.4.13 | |||
#sqlalchemy==1.3.24 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
redundant comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
No. This makes it easy for me to test with 1.3. :) I want to make sure I don't break 1.3 but the compliance tests are too expensive to tun twice, so I just run them manually.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
On second thought, let's run the compliance test for both in CI.
pybigquery/sqlalchemy_bigquery.py
Outdated
@@ -57,6 +58,12 @@ | |||
FIELD_ILLEGAL_CHARACTERS = re.compile(r"[^\w]+") | |||
|
|||
|
|||
def assert_(cond, message="Assertion failed"): # pragma: NO COVER | |||
if not cond: | |||
breakpoint() |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
do we want to leave this breakpoint in?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Nope! Thanks.
super(BigQueryCompiler, self).__init__( | ||
dialect, statement, column_keys, inline, **kwargs | ||
) | ||
super(BigQueryCompiler, self).__init__(dialect, statement, *args, **kwargs) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
When i worked on this change, i was a bit worried about the consequences of users passing "inline" as a named parameter.
AFAIR - it was removed from SQLA right?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I wasn't thinking about users passing inline
. :)
Yes, SQLA removed it in 1.4. I want this code to work with earlier versions and since we're only using statement
, I'm just passing the later arguments along.
@@ -0,0 +1 @@ | |||
sqlalchemy==1.3.24 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
why Is that different than 3.9 constraint on SQLA?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
To make sure we run with 1.3 in some of the unit tests.
There are code paths needed for 1.3 that aren't exercised with 1.4. Without this, we wouldn't have the required 100% test coverage (and wouldn't be testing with 1.3).
@alonme Thanks for taking a look! |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Generally looks fine, although I know far too few details about SQLALchemy dialects to give a definite verdict.
The version check is something that would be nice to fix, the rest are just trivial remarks.
@plamut thanks for the review! |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM
(with that mandatory disclaimer :) )
Thank you for opening a Pull Request! Before submitting your PR, there are a few things you can do to make sure it goes smoothly:
Fixes #83 🦕